【问题标题】:How can I make node wait before returning the document?如何让节点在返回文档之前等待?
【发布时间】:2021-02-02 12:03:41
【问题描述】:

当我检索一个 json 文档时,我想更新一个邀请数组。该数组由 _id 值组成,我想更新并设置为用户名。为此,我查找 _id 并找到相应的用户名。然而,array.push 函数在查找相应的用户名之前完成。因此添加了一个空值。找到对应的用户名后,如何让节点等待推送。

exports.contactBoard = (req, res) => {
    const username = req.params.username;
    contactUsername = '';
    User.findOne({
        'username': username
    }).then(document => {
        document.invitationsFromFriends.forEach(element => {
            User.findById(element).then(document => {
                contactUsername = document.username;
                console.log("locatie 1" + contactUsername)
            })
        })
        console.log("locatie 2" + contactUsername)
        document.invitationsFromFriends.push(contactUsername);
        res.status(200).json({
            message: "retrieved user contacts",
            contacts: document
        })
    })
}

【问题讨论】:

  • 只需将res.status(200).json(....) 调用移到User.findById().then() 函数内即可。

标签: node.js asynchronous


【解决方案1】:

使用async-awaitpromise 来执行此操作。

由于数据库请求是异步执行的,您需要等待它返回以发送响应或从 promise 的回调中发送。

对于 Async-Await,这可能是一种重构:

exports.contactBoard = async (req, res) => {
...
const doc = await User.findOne({'username': username}).exec();

doc.invitationsFromFriends.forEach (async element =>
        const doc1 = await User.findById(element).exec()
          contactUsername = doc1.username;
          console.log("locatie 1" + contactUsername)
        }))
        console.log("locatie 2" + contactUsername)
        document.invitationsFromFriends.push(contactUsername);

res.status(200).json({
    message:"retrieved user contacts",
    contacts: document
})

对于承诺发送回调的响应:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-24
    • 2010-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-06
    • 2020-04-13
    相关资源
    最近更新 更多