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));
});
所以我们现在 return 中间件函数中的 promise,我们可以放弃 catch 块。
所以在内部,它现在可能看起来像这样:
nextMiddlewareFn(req,res,next);
只是想将其更改为:
const v = nextMiddlewareFn(req,res,next);
if(v && typeof v.catch === 'function'){
v.catch(next);
});
有谁知道如何使用 Express 执行此操作?
请注意 reader,以下实际上不起作用:
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));
});
如果 promise 被拒绝,围绕每个中间件的 try/catch 将不会实际拾取它,如果 promise 被拒绝,它将冒泡到一个 unhandledRejection 处理程序(如果有的话)。
我期待一个好的解决方案:
- 可以用 TypeScript 打字
- 不使用 async/await。
这是目前最适合我的解决方案:
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.与带有 promise 的常规函数没有明显区别。
您可能还想尝试通用解决方案:asyncback。
在 ExpressJS 中的使用 middle-ware:
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函数returns或抛出异常时,express传给asyncback的next
回调会相应自动调用
我有以下简化的中间件功能:
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));
});
所以我们现在 return 中间件函数中的 promise,我们可以放弃 catch 块。
所以在内部,它现在可能看起来像这样:
nextMiddlewareFn(req,res,next);
只是想将其更改为:
const v = nextMiddlewareFn(req,res,next);
if(v && typeof v.catch === 'function'){
v.catch(next);
});
有谁知道如何使用 Express 执行此操作?
请注意 reader,以下实际上不起作用:
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));
});
如果 promise 被拒绝,围绕每个中间件的 try/catch 将不会实际拾取它,如果 promise 被拒绝,它将冒泡到一个 unhandledRejection 处理程序(如果有的话)。
我期待一个好的解决方案:
- 可以用 TypeScript 打字
- 不使用 async/await。
这是目前最适合我的解决方案:
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.与带有 promise 的常规函数没有明显区别。
您可能还想尝试通用解决方案:asyncback。
在 ExpressJS 中的使用 middle-ware:
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函数returns或抛出异常时,express传给asyncback的next
回调会相应自动调用