【问题标题】:Mongoose not picking up on callback variables for renderMongoose 没有使用回调变量进行渲染
【发布时间】:2020-08-17 09:35:29
【问题描述】:
app.get("/users/:id", function (req, res) {
    User.findById(req.params.id, function (err, foundUser) {
        if (err) {
            console.log(err)
        } else {
            console.log(foundUser)
        }
    })
    Item.countDocuments({ UID: req.params.id }, function (err, itemCount) {
        if (err) {
            console.log(err)
        } else {
            console.log(itemCount)
        }
    })
    Item.find({ UID: req.params.id }, function (err, foundItems) {
        if (err) {
            console.log(err)
        } else {
            console.log(foundItems)
        }

    })
    res.render("users/show", { user: foundUser, newListItems: foundItems, itemCount: itemCount})

由于某种原因,这不会呈现并一直说变量不存在,尽管上面有回调。使用 EJS 进行渲染。

【问题讨论】:

  • console.log 不打算返回任何内容。改用return 并保留console.log 用于错误输出

标签: node.js mongodb mongoose ejs


【解决方案1】:

正如 Richie 所建议的,您不能从外部范围内的回调中访问变量

app.get("/users/:id", function (req, res) { 
    User.findById(req.params.id, function (err, foundUser) { 
        if (err) { console.log(err) } 
        else {
            console.log(foundUser) 

            Item.countDocuments({ UID: req.params.id }, function (err, itemCount) { 
                if (err) { console.log(err) } 
                else { 
                    console.log(itemCount) 
                    Item.find({ UID: req.params.id }, function (err, foundItems){ 
                        if (err) { console.log(err) } 
                        else { 
                        console.log(foundItems);   
                        res.render("users/show", { user: foundUser, newListItems: foundItems, itemCount: itemCount})
                        } 
                    });
                } 
            }); 
        } 
    });
});

请注意,我已将 res.render 方法放在回调中,以便它可以使用变量。

编辑

正如 Marcel Djaman 所建议的,您应该使用 async/await 使代码更具可读性。阅读更多关于async/awaithere

app.get("/users/:id", async function (req, res) { 
    try {
        const foundUser = await User.findById(req.params.id);
        console.log(foundUser) 

        const itemCount = await Item.countDocuments({ UID: req.params.id });
        console.log(itemCount) 

        const foundItems = await Item.find({ UID: req.params.id });
        console.log(foundItems);   
        res.render("users/show", { user: foundUser, newListItems: foundItems, itemCount: itemCount});
    } catch(err) {
        console.error(err)
    }
});

您可以注意到这段代码比上面的代码简单得多。

【讨论】:

【解决方案2】:

我可能读错了代码,但回调变量不是超出 res.render 方法的范围吗? 您可能需要从每个 Mongoose 查询返回回调,并将它们存储在 res.render 方法范围内的变量中。

【讨论】:

  • 是的,我该怎么做...我有点不喜欢 JS,但在 python 中你可以使用全局变量之类的东西...在这里可以工作吗
  • 非常感谢...这有效,我现在意识到如果这些变量不在回调范围内,您将无法访问它们。谢谢!
  • 你可以在 app.get 方法中声明变量
猜你喜欢
  • 2015-10-23
  • 2019-07-06
  • 2022-01-01
  • 2011-11-23
  • 2011-09-22
  • 1970-01-01
  • 2019-12-16
  • 1970-01-01
  • 2017-09-28
相关资源
最近更新 更多