Expressjs路线请求&回复是异步的?

时间:2015-09-26 21:02:00

标签: node.js asynchronous express

我有疑问,真的不是问题,但我想知道我处理请求和响应的实际结构是否是非阻塞的。

我的一些代码如下所示:

get: (req, res) ->
    permission = req.user.username

    if not permission
      return res.json new Unauthorized("#{req.user.username} no tiene permisos")

    Client.find()
      .exec (err, clients) ->
        if err then res.json new Internal(err.message, err.stack)
        if not clients then res.json new NotFound('No encontrado')

        res.json new Ok(clients, 'OK')

当然是在路由器存档中处理,但我并不完全知道我的代码何时异步以及什么时候不是。

那么,如果这是异步非阻塞代码,有人可以解释一下吗?如果不是,请提供一些文档或库?我试着使用promisejs,但它在执行中抛出了一些错误(我认为这是因为我非常棒)。

这就是全部,先谢谢!

1 个答案:

答案 0 :(得分:2)

Mongoose的exec()是代码中的异步功能。根据经验,昂贵的操作是异步的,而便宜的操作不是*。昂贵意味着需要几毫秒的操作,例如读取远程文件,访问(可能)远程数据库甚至读取本地文件。一些昂贵的异步操作的例子:

  • request:加载外部网站。
  • fs:从您的系统中读取文件。大多数函数都是异步的,但由于读取文件并不昂贵,因此它们也具有同步版本。
  • mongoose:正如@Molda所解释的那样,你的mongoose调用是异步的。大多数猫鼬行动都是。

此外,异步函数的特点是它们打破了文件的流,因此它们通常包含一个执行流继续的回调。在节点中,这些回调接受两个或多个参数作为约定,第一个参数是错误,另一个参数是检索的数据。以前的示例:

request('httsp://google.com/', function(err, response, body){
  console.log(body);   // print the website's html on the terminal
});

fs.readFile('/config.js', function(err, message){
  console.log(message);   // print the contents of config.js on the terminal
});

User.find({ id: 25 }, function(err, user){
  console.log(user);  // print user's 25 data on the terminal
});

编辑:作为替代方案,您可以通过在find()中包含回调来简化代码一行,使此函数异步:

Client.find {}, (err, clients) ->
  if err then res.json new Internal(err.message, err.stack)
  if not clients then res.json new NotFound('No encontrado')

  res.json new Ok(clients, 'OK')

*请注意昂贵的便宜是高度相关的。例如,parsing a huge file in JSON can be really expensive并且它们是同步的,而执行小文件读取则相对便宜。