gpt4 book ai didi

express - 如何优雅地处理 express 中的 promise rejection

转载 作者:行者123 更新时间:2023-12-04 02:49:59 25 4
gpt4 key购买 nike

我有以下 express Controller

class ThingsController {

static async index(req, res, next) {
try {
const things = await Thing.all();
res.json(things);
} catch(err) {
next(err);
}
}
}

和路由器

router.route('/things').get(ThingsController.index)

在我的应用程序中,我计划有几个 Controller 使用 Promise 来呈现结果

我不想每次都重复 try/catch block

我的第一个解决方案是将这个逻辑提取到处理 promise 拒绝函数中:

const handlePromiseRejection = (handler) =>

async (req, res, next) => {
try{
await handler(req, res, next);
} catch(err) {
next(err);
};
};

现在我们可以从 ThingsController.index 中删除 try/catch block ,并且需要将路由器更改为:

router.route('/things')
.get(handlePromiseRejection(ThingsController.index))

但是在每条路线上添加 handlePromiseRejection 可能是一项繁琐的任务,我希望有更聪明的解决方案。

你有什么想法吗?

最佳答案

在路由中使用 async/await 处理错误的正常方法是捕获错误并将其传递给 catch all 错误处理程序:

app.use(async (req, res) => {
try {
const user = await someAction();
} catch (err) {
// pass to error handler
next(err)
}
});

app.use((err, req, res, next) => {
// handle error here
console.error(err);
});

使用 express-async-errors 包,您可以简单地 throw (或者不用担心从某些函数抛出的 error )。来自文档:它没有修补 express Router 上的所有方法,而是将 Layer#handle 属性包装在一个地方,使所有其余的 express 内容完好无损。

用法很简单:

require('express-async-errors'); // just require!
app.use(async (req, res) => {
const user = await User.findByToken(req.get('authorization')); // could possibly throw error, implicitly does catch and next(err) for you

// throw some error and let it be implicitly handled !!
if (!user) throw Error("access denied");
});

app.use((err, req, res, next) => {
// handle error
console.error(err);
});

关于express - 如何优雅地处理 express 中的 promise rejection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55504066/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com