Express 如何确保在查询数据库后发送'req'?

Express 如何确保在查询数据库后发送'req'?,express,mongoose,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 do

从客户端接收到
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(查询、字段、选项、回调)
是一种异步方法。
res.json(doc)
不起作用


如何确保
res
发送
doc

您不应该在异步函数之外发送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);
    })
}

您不应该在异步函数之外发送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);
    })
}

你在用ES6吗?您可以使用es6或其他承诺,因为Article.find会为您返回一个新承诺

Article.find(...).then((doc) => res.json(doc))
                 .catch((err) => { // error handling });
如果不想在catch块内执行res.send,还可以将方法声明为async,然后使用wait命令使调用同步。像这样:

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,因此可能有其他更适合您需要的解决方案。注意,异步等待也是ES6超集的一部分

在这里,您可以获得有关async/await的更多信息

如果出于某种原因,您使用的不是ES6而是ES5,那么您也可以使用npm模块来实现承诺或异步/等待


您正在使用ES6吗?您可以使用es6或其他承诺,因为Article.find会为您返回一个新承诺

Article.find(...).then((doc) => res.json(doc))
                 .catch((err) => { // error handling });
如果不想在catch块内执行res.send,还可以将方法声明为async,然后使用wait命令使调用同步。像这样:

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,因此可能有其他更适合您需要的解决方案。注意,异步等待也是ES6超集的一部分

在这里,您可以获得有关async/await的更多信息

如果出于某种原因,您使用的不是ES6而是ES5,那么您也可以使用npm模块来实现承诺或异步/等待


如果您不想发送最后一条消息,只需删除该行即可。在
res.json
检查
如果(doc.length==0)res.send(“我不想发送的消息”)
如果不想发送最后一条消息,只需删除该行即可。在
res.json
检查
之前,一旦查询完成,服务器将做出响应。如果(doc.length==0)res.send(“我不想发送的消息”)
我尝试过,服务器将不发送回任何信息。我尝试过,服务器将不发送回任何信息。