Express中间件 - 添加promise拒绝处理程序

时间:2018-03-21 19:27:10

标签: node.js express express-4

我有以下简化的中间件功能:

router.put('/', function (req, res, next) {

  const data = req.body;
  const q = req.parsedFilterParam;
  const opts = req.parsedQueryOpts;

  ResponseCtrl.update(q, data, opts)
  .then(stdPromiseResp(res))
  .catch(next);
});

我想添加一些能力来捕获中间件的错误,只是为了保存一些代码,如下所示:

router.put('/', function (req, res, next) {

  const data = req.body;
  const q = req.parsedFilterParam;
  const opts = req.parsedQueryOpts;

  return ResponseCtrl.update(q, data, opts)
  .then(stdPromiseResp(res));

});

所以我们现在返回中间件函数中的promise,我们可以放弃catch块。

在内部,它现在可能看起来像这样:

nextMiddlewareFn(req,res,next);

只是想把它改成:

const v = nextMiddlewareFn(req,res,next);
if(v && typeof v.catch === 'function'){
   v.catch(next);
});

有人知道怎么用Express吗?

3 个答案:

答案 0 :(得分:1)

请读者注意,以下内容实际上并不起作用:

router.put('/', async function (req, res, next) {

  const data = req.body;
  const q = req.parsedFilterParam;
  const opts = req.parsedQueryOpts;

  await ResponseCtrl.update(q, data, opts)
  .then(stdPromiseResp(res));

});

如果承诺被拒绝,围绕每个中间件的try / catch实际上都没有获取它,如果承诺被拒绝,它将冒泡到一个未处理的撤销处理程序(如果有)。

我期待一个很好的解决方案,但是:

  1. 可以使用TypeScript
  2. 键入
  3. 不使用async / await。
  4. 这是迄今为止最适合我的解决方案:

    https://medium.com/@the1mills/hacking-express-to-support-returned-promises-in-middleware-9487251ca124

答案 1 :(得分:1)

使用express promise router

var router = new ExpressPromiseRouter();

router.get('/foo', function(req, res) {
  return somethingPromisey();
});
// or...
router.get('/bar', async function(req, res) {
  await somethingPromisey();
});

app.use(router);

PS:There's no need to be afraid of async/await on performance grounds.与承诺的常规功能相比没有明显差异。

答案 2 :(得分:1)

您可以尝试asyncback模块用于此目的:

const asyncback = require('asyncback');

app.get('/users', asyncback(async (req, res) => {
    const users = await User.find({ 'banned': false });
    const offer = await Offers.findOne({ 'active': true });
    res.json({ 'users': users, 'offer': offer });
}));

当async函数返回或抛出时,将自动调用express传递给asyncback的next回调。