app.use(async function(req, res, next) { try { var myres = await new Promise((resolve, reject) => { mysql_connection.query("select * from Users;", (err, rows) => { if (err) { reject(err); } else { resolve(rows); } }); }); } catch (error) { console.log(error); } });
问题是。使用异步功能能够将等待用于数据库查询可以吗?我担心这可能会在expressjs方面引起一些问题。
异步等待可以毫无问题地用于数据库查询。您可以使用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); }));
如果抛出错误,则控件将被移交给错误处理中间件,该中间件是middlware,它具有以下四个参数:
app.use(function (err, req, res, next) { // your error code })