如何确保在查询数据库之后发送`req`?

时间:2018-03-08 13:05:38

标签: express mongoose

从客户端收到req后,服务器将查询mongodb然后发送res

var Article = mongoose.model('articles', articleSchema);

app.get('/api/topic',function(req,res){

    Article.find({"articleID":1},function(err,doc){
         res.json(doc)
    })

   res.send("the message that I don't want to send")
}

但是Model.find(query, fields, options, callback)是一种异步方法。 res.json(doc)不起作用。

如何确保res发送doc

2 个答案:

答案 0 :(得分:2)

您使用的是ES6吗?您可以使用es6或其他Promise,因为Article.find会为您返回一个新的Promise。

Article.find(...).then((doc) => res.json(doc))
                 .catch((err) => { // error handling });

如果您不想在catch-block中执行res.send,您还可以将方法声明为异步,然后使用await命令使您的调用同步。像这样:

app.get('/api/topic', async function(req,res){

    await Article.find({"articleID":1},function(err,doc){
         res.json(doc)
    })

   res.send("the message that I don't want to send")
}

但是我们真的不知道为什么你需要第二个res,所以可能有其他解决方案更适合你的需求。请注意,async await也是ES6 Superset的一部分。

在这里,您可以获得有关async / await

的更多信息

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function

如果由于某种原因你不使用ES6而ES5,你也可以使用npm模块进行promises或async / await。

https://www.npmjs.com/package/es6-promise

https://www.npmjs.com/package/es6-async

答案 1 :(得分:0)

您不应该在异步功能之外发送res。尝试下面的代码来处理错误,并另外检查查找是否为空。

var Article = mongoose.model('articles', articleSchema);

app.get('/api/topic',function(req,res){

    Article.find({"articleID":1},function(err,doc){
         if(err)
           res.send(err);

         if(doc.length === 0)
           res.send(`No records found.`);
         else
           res.json(data);
    })
}