如何在Connect中间件里面对mongoDB进行asynchronous调用?

比方说,我有以下的Express / Connect中间件:

return function(req, res, next) { mongoose.connect(url, options); var Config = mongoose.model('Config', mongoose.Schema({ field1: Boolean, field2: [] })); Config.findOne({}, function (err, doc) { if(!err) { if(someCondition) // some logic: send response and interrupt middleware chain res.end('Some response'); else next(); } } }; 

问题是数据库调用是asynchronous的。 所以中间件函数在执行任何逻辑之前退出。 任务很简单:从mongoDB读取configuration,如果某个字段值=“某些”发送响应,否则 – 继续中间件链。

所以,我现在有两个问题

  1. 有没有办法在中间件内部进行asynchronous调用?
  2. 如果没有,是否有任何解决方法? (AFAIK,没有办法同步执行数据库调用)

所以中间件函数在执行任何逻辑之前退出。

是的,但是对于node.jsasynchronous代码来说,这是完全正常的。 这就是asynchronous代码的工作原理。 数据库调用完成后,控制stream程将恢复,您可以在此时发送响应或调用next() 。 这可以。

有没有办法在中间件内部进行asynchronous调用?

是的,你这样做的方式是好的(减去下面列出的一些小的警告)。

如果没有,是否有任何解决方法?

没有必要的解决方法。 这就是node.js的devise。 node.js中的所有networkingI / O都是asynchronous的。

一些小的笔记

  • 确保在数据库callback函数逻辑的每个可能分支中发送响应或调用next() :error,someCondition为true,someCondition为false。 如果你的任何一个逻辑可能在没有响应请求的分支中结束,并且不会调用next()那么请求将会挂起,直到由于超时而失败。 上面的代码片段缺lesserror handling,您需要执行此操作。
  • 将你的mongoose连接调用移动到应用程序启动时间。 请勿连接每个请求。
  • 将您的mongoose模型定义移出到一个单独的模块Config.js