【问题标题】:Unable to add object fetched from mongoDB to normal javascript array无法将从 mongoDB 获取的对象添加到普通的 javascript 数组
【发布时间】:2021-12-13 18:56:48
【问题描述】:

我正在尝试创建一个添加到购物车按钮,该按钮使用我选择的特定产品的 ID 从产品数据库中获取数据。我正在尝试将使用相同 ID 找到的对象推送到普通的 javascript 数组中,然后使用 ejs 方法显示它。在我尝试的时候,我发现我无法以对象形式推送数据。

总结:

在第 7 行,我声明了一个数组,我想在该数组中存储一些我从 db 模型中获取的对象。 在第 15 行,我试图将对象表单推送到我的数组中,以便我可以遍历对象以使用 ejs 在我的页面上显示它们。但我做不到。

截图:

  1. 这是我在尝试将对象推送到数组后得到的最终结果:

empty array logged

  1. 这是我要推送的对象:

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 但无法将它们存储为对象数组。

【问题讨论】:

  • 你不是在等待你的第二个承诺/回调。 `console.log(bookArray);`这应该只在你得到第二个数组的结果后运行。,使用异步等待或promiseAll
  • 嘿 Sojin,我尝试使用 async-await 但它不起作用。这是我得到的错误: nhandledPromiseRejectionWarning: MongooseError: Query is already executed: productData.findOne({ _id: new ObjectId("6177e7b5aaa6cae0d4c... at model.Query._wrappedThunk [as _findOne] (D:\Mohit\Web\INT 220 - 最终项目\BookStore\node_modules\mongoose\lib\helpers\query\wrapThunk.js:21:19)

标签: javascript node.js arrays object ejs


【解决方案1】:

看起来像一个时间问题,您的代码在数据库下载对象并将它们推送到您的数组之前完成。

这应该可以解决您的问题:

// ...
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) => { // ...

【讨论】:

  • 嘿,你提到的方法是抛出一个错误: UnhandledPromiseRejectionWarning: MongooseError: Query is already executed: productData.findOne({ _id: new ObjectId("6177e7b5aaa6cae0d4c... at model.Query._wrappedThunk [ as _findOne] (D:\Mohit\Web\INT 220 - 最终项目\BookStore\node_modules\mongoose\lib\helpers\query\wrapThunk.js:21:19)
  • 我编辑了我的答案,你能看看新版本吗?
  • 谢谢大佬,我想我需要重新学习一下javascript promises的概念。干得好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-09
  • 1970-01-01
  • 2020-11-21
  • 2020-03-17
相关资源
最近更新 更多