Express.js使用回调执行流程

Luc*_*rzi 3 asynchronous node.js express

我对express.js应用程序的执行流程有很大的疑问,其中存在对数据库的异步请求.我已经阅读了有关Node.js架构的内容,我知道当我执行阻塞请求(如数据库请求)时,请求是在一个线程上执行的,当请求满足时,添加工作(回调函数的代码,已在事件队列中为阻止请求指定.现在......因为我使用mongoDb作为应用程序数据库,并且因为mongodb不提供执行同步请求的方法,所以如何确保在查询完成之前不执行对客户端的响应?

例如,在这种情况下我有一个请求处理程序(不是中间件):

app.all("/",function(req,res){

    db.find({},function(err,doc){

     //Retreive certain informations from the db needed by the client

    });
});

app.all("/",function(req,res){
   res.status(200).end();
});
Run Code Online (Sandbox Code Playgroud)

这是使用express.js和mongodb的一个常见例子......

但是执行流程实际上是如何进行的?

对于中间件我没有这个疑问,因为执行流程会停止,直到调用next()方法(并且您可以在数据库回调中调用它).

提前致谢,

卢卡·M

Pla*_*ato 8

既然你在next()这里提到的是如何链接中间件的基本例子:

function findInDb(id, callback){
  db.get(id, function(err, data){
    if(err){ return callback(err) };
    var obj = JSON.parse(data)[0] // or something
    callback(null, obj)
  });
};

app.all('*', function(req, res, next){
  findInDb('something', function(err, obj){
    if(err){ return next(err) };
    res.myObj = obj;
    next();
  });
});

app.get('/', function(req, res){
  // By now the first middleware executed
  res.status(200).json(res.myObject);
});
Run Code Online (Sandbox Code Playgroud)