2017-04-19 57 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(); 
 
}));

你會得到一個適當的狀態代碼,就不會有超時了。

也有幾個模塊,你可以使用,如果你不想自己把它包:

相關問題