簡體   English   中英

Express中間件-添加承諾拒絕處理程序

[英]Express middleware - add promise rejection handlers

我具有以下簡化的中間件功能:

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做到這一點?

使用快遞承諾路由器

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: 無需出於性能考慮而害怕async / await 與帶有承諾的常規函數​​相比,沒有明顯的區別。

您可以為此目的嘗試使用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 });
}));

當異步函數返回或引發時,將自動調用由express傳遞給異步回調的next回調。

請注意,以下內容實際上不起作用:

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並不會實際得到它;如果諾言被拒絕,則如果存在一個承諾,它將冒泡到一個unhandledRejection處理程序。

我希望有一個好的解決方案,但是:

  1. 可以用TypeScript鍵入
  2. 不使用異步/等待。

到目前為止,這是最適合我的解決方案:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM