2017-04-19 58 views
5

让我们看看下面修改后的Restify示例,它现在包含了节点7/8的异步/等待支持。使节点7异步/等待来控制器控制器

我对express/restify /等的正确实现有一点担忧。我担心的是,在事件循环中承诺的时间比需要的时间更长......我知道这不完全是承诺,但是我应该关心这种实现吗?我还没有注意到任何问题。

'use strict'; 

const restify = require('restify'); 
const User = require('./models/User'); 

const server = restify.createServer({ 
    name: 'myapp', 
    version: '1.0.0' 
}); 

server.use(restify.acceptParser(server.acceptable)); 
server.use(restify.queryParser()); 
server.use(restify.bodyParser()); 

server.get('/echo/:name', async function (req, res, next) { 
    try { 
    const user = await User.findOne({ 
     name: req.params.name; 
    }); 
    res.send(user.get({plain: true})); 
    } catch (error) { 
    console.error(error); 
    res.send(500); 
    } 
    return next(); 
}); 

server.listen(8080, function() { 
    console.log('%s listening at %s', server.name, server.url); 
}); 

回答

0

没有与使用async功能,而不是常规的功能接受回调作为错误被不同地处理的问题。

在回调函数(又名“错误回退”)中,回调函数必须调用,而不管执行是否成功。第一个参数是一个错误对象。

async函数只是在出现任何错误(同步或异步)的情况下返回被拒绝的承诺。

因此,默认情况下,Express.js/Restify会期望定期发生错误。如果您通过async函数,并且失败,则Express.js/Restify将继续等待被称为忽略拒绝的承诺的回调。它根本没有意识到退还的承诺,不处理它。 最后,回调将不会被调用,并且端点将超时。

所以你将无法正确处理错误。

你可以尝试一下:

server.get('/echo/:name', async function (req, res, next) { 
    throw new Error(); 
}); 

因此,作为一个经验法则,我建议你不要混淆概念,从来没有过的回调异步功能。这是一面红旗。

为了解决这个问题,你需要使用包装像这样的例子:

const wrap = function(fn) { 
 
    return function(req, res, next) { 
 
     return fn(req, res, next).catch(function(err) { 
 
      return next(err); 
 
     }); 
 
    }; 
 
}; 
 
server.get('/echo/:name', wrap(async function (req, res, next) { 
 
    throw new Error(); 
 
}));

你会得到一个适当的状态代码,就不会有超时了。

也有几个模块,你可以使用,如果你不想自己把它包:

相关问题