一尘不染

Express JS对请求使用异步功能

node.js

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方面引起一些问题。


阅读 324

收藏
2020-07-07

共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);
}));

如果抛出错误,则控件将被移交给错误处理中间件,该中间件是middlware,它具有以下四个参数:

app.use(function (err, req, res, next) {
   // your error code
})
2020-07-07