Express JS对请求使用异步功能

时间:2018-07-26 09:27:47

标签: node.js express async-await

31

问题是。使用异步功能能够将等待用于数据库查询可以吗?恐怕这可能会在expressjs方面引起一些问题。

4 个答案:

答案 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块中,以便您可以捕获异常。