无法将从 mongoDB 获取的对象添加到普通 javascript 数组
Unable to add object fetched from mongoDB to normal javascript array
我正在尝试创建一个添加到购物车按钮,该按钮使用我选择的特定产品的 ID 从产品数据库中获取数据。我试图将使用相同 Id 找到的对象推入普通 javascript 数组,然后使用 ejs 方法显示它。当我正在尝试时,我发现我无法以对象形式推送数据。
总结:
在第 7 行我声明了一个数组,我想在该数组中存储一些我从数据库模型中获取的对象。
在第 15 行,我试图将对象形式推送到我的数组中,以便我可以遍历对象以使用 ejs 在我的页面上显示它们。但是我做不到。
截图:
- 这是我在尝试将对象推入数组后得到的最终结果:
empty array logged
- 以下是我要推送的对象:
Objects
代码:
app.get("/cart", (req, res) => {
if (req.isAuthenticated()) {
const findcartdata = req.user.username;
userData.findOne({email: findcartdata}, (err, BookId) => {
// console.log(BookId.cartItemId);
const idArray = BookId.cartItemId;
var bookArray = [];
idArray.forEach((data) => {
productData.findOne({_id: data}, (err, foundBookData) =>{
// console.log(foundBookData);
if(err){
console.log(err);
}
else{
bookArray.push(foundBookData);
}
})
});
console.log(bookArray);
// res.render("cart", {
// cartBookArray: BookId.cartItemId
// })
});
} else {
res.redirect("/login");
}
})
在上面的代码中,我使用护照身份验证用户方法找到了用户的电子邮件,并使用该电子邮件将产品添加到不同的 javascript 数组中(我打算将其传递到购物车的 ejs 文件中然后在列表中迭代它)使用我从另一个名为 userData 的模型获得的那些 Id 数组。问题是我能够找到每个 Id 的 userData 但无法将它们存储为对象数组。
看起来像是一个时间问题,您的代码在数据库下载对象并将它们推送到您的数组之前完成。
这应该可以解决您的问题:
// ...
const idArray = BookId.cartItemId;
var bookArray = [];
for (const data of idArray) {
const foundBookData = await productData.findOne({_id: data}).catch(console.error);
if (!foundBookData) continue;
bookArray.push(foundBookData);
}
console.log(bookArray);
// ...
顺便说一下,确保整个函数也是异步的,这可以通过更改以下行来完成:
userData.findOne({email: findcartdata}, async (err, BookId) => { // ...
我正在尝试创建一个添加到购物车按钮,该按钮使用我选择的特定产品的 ID 从产品数据库中获取数据。我试图将使用相同 Id 找到的对象推入普通 javascript 数组,然后使用 ejs 方法显示它。当我正在尝试时,我发现我无法以对象形式推送数据。
总结:
在第 7 行我声明了一个数组,我想在该数组中存储一些我从数据库模型中获取的对象。 在第 15 行,我试图将对象形式推送到我的数组中,以便我可以遍历对象以使用 ejs 在我的页面上显示它们。但是我做不到。
截图:
- 这是我在尝试将对象推入数组后得到的最终结果:
empty array logged
- 以下是我要推送的对象:
Objects
代码:
app.get("/cart", (req, res) => {
if (req.isAuthenticated()) {
const findcartdata = req.user.username;
userData.findOne({email: findcartdata}, (err, BookId) => {
// console.log(BookId.cartItemId);
const idArray = BookId.cartItemId;
var bookArray = [];
idArray.forEach((data) => {
productData.findOne({_id: data}, (err, foundBookData) =>{
// console.log(foundBookData);
if(err){
console.log(err);
}
else{
bookArray.push(foundBookData);
}
})
});
console.log(bookArray);
// res.render("cart", {
// cartBookArray: BookId.cartItemId
// })
});
} else {
res.redirect("/login");
}
})
在上面的代码中,我使用护照身份验证用户方法找到了用户的电子邮件,并使用该电子邮件将产品添加到不同的 javascript 数组中(我打算将其传递到购物车的 ejs 文件中然后在列表中迭代它)使用我从另一个名为 userData 的模型获得的那些 Id 数组。问题是我能够找到每个 Id 的 userData 但无法将它们存储为对象数组。
看起来像是一个时间问题,您的代码在数据库下载对象并将它们推送到您的数组之前完成。
这应该可以解决您的问题:
// ...
const idArray = BookId.cartItemId;
var bookArray = [];
for (const data of idArray) {
const foundBookData = await productData.findOne({_id: data}).catch(console.error);
if (!foundBookData) continue;
bookArray.push(foundBookData);
}
console.log(bookArray);
// ...
顺便说一下,确保整个函数也是异步的,这可以通过更改以下行来完成:
userData.findOne({email: findcartdata}, async (err, BookId) => { // ...