Node.js 如何使节点在返回文档之前等待?

Node.js 如何使节点在返回文档之前等待?,node.js,asynchronous,Node.js,Asynchronous,检索json文档时,我希望更新一个邀请数组。这个数组由_id值组成,我想更新这些值并将其设置为用户名。为此,我查找_id并找到相应的用户名。但是,array.push函数在查找相应用户名之前完成。因此会添加一个空值。如何使节点仅在找到相应的用户名后才等待推送 exports.contactBoard = (req, res) => { const username = req.params.username; contactUsername = ''; User.f

检索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
        })
    })
}

使用
async wait
promise
执行此操作

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

对于Async Wait,这可能是一个可能的重构:

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
})

对于promise,从回调发送响应:

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