31
问题是。使用异步功能能够将等待用于数据库查询可以吗?恐怕这可能会在expressjs方面引起一些问题。
答案 0 :(得分:5)
async..await
是诺言的语法糖,诺言只是依赖回调的一种模式。在环境支持的任何地方都可以使用async
函数。从Node.js 7.6.0开始支持async..await
。
async
函数始终返回承诺。只要此隐式返回值不会引起问题,它在包括Express在内的所有地方都很好。不管它是用于数据库查询还是其他任何东西,都没有关系。
除非API支持promise,否则错误应完全在async
函数中处理。函数主体应该用try..catch
包装,以排除未处理的拒绝,这可能会导致将来的Node版本出现异常。
原始代码不包含任何next
调用,只是抑制了错误。根据经验,async
中间件的结构应如下:
app.use(async function(req, res, next) {
try {
...
next();
} catch (error) {
next(error);
}
});
答案 1 :(得分:1)
异步等待可以毫无问题地用于数据库查询。您可以使用try catch,但是还有一个更优雅的解决方案,该解决方案使您可以使用提供以下内容的错误处理中间件:
您可以使用以下功能包装中间件:
const asyncMiddleware = fn =>
(req, res, next) => {
Promise.resolve(fn(req, res, next))
.catch(next);
};
然后您可以按以下方式使用它:
const asyncMiddleware = require('./utils/asyncMiddleware');
router.get('/', asyncMiddleware(async (req, res, next) => {
/*
if there is an error thrown in getUserFromDb, asyncMiddleware
will pass it to next() and express will handle the error;
*/
const user = await getUserFromDb({ id: req.params.id })
res.json(user);
}));
如果引发错误,则控件将被移交给错误处理中间件,该中间件是具有以下四个参数的中间件:
app.use(function (err, req, res, next) {
// your error code
})
答案 2 :(得分:1)
您还可以在 server.ts 或 server.js 上导入处理 express 异步错误的 https://www.npmjs.com/package/express-async-errors
yarn add express-async-errors
并在您的主文件中导入它 import 'express-async-errors';
。
答案 3 :(得分:0)
使用异步功能来对数据库查询使用等待是完全可以的。但是,请尝试将代码嵌入try and catch块中,以便您可以捕获异常。