我有疑问,真的不是问题,但我想知道我处理请求和响应的实际结构是否是非阻塞的。
我的一些代码如下所示:
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,但它在执行中抛出了一些错误(我认为这是因为我非常棒)。
这就是全部,先谢谢!
答案 0 :(得分:2)
Mongoose的exec()
是代码中的异步功能。根据经验,昂贵的操作是异步的,而便宜的操作不是*。昂贵意味着需要几毫秒的操作,例如读取远程文件,访问(可能)远程数据库甚至读取本地文件。一些昂贵的异步操作的例子:
此外,异步函数的特点是它们打破了文件的流,因此它们通常包含一个执行流继续的回调。在节点中,这些回调接受两个或多个参数作为约定,第一个参数是错误,另一个参数是检索的数据。以前的示例:
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并且它们是同步的,而执行小文件读取则相对便宜。