如何使用自定义中间件将 "async" 添加到路由?

How to add "async" to a route with a custom middleware?

我需要在 Express 的路线中使用 await,因此它必须是 async。但是,当我尝试将 async 添加到路由时,它不起作用,因为我使用了中间件。

api.get('/users/yop', CORS(CORSOPT), async, checkauth, (req, res) => {
  await GETDATA.getUsers(db.collection('users'));
  res.json(users[req.user]);
})

中间件看起来像这样:

function checkauth(req, res, next) {
 ...
 next();
}

如果 asynccheckout 像我发布的代码一样用逗号分隔,我会收到此错误: await is only valid in async function

如果它们没有用逗号分隔,我的代码编辑器会将其标记为语法错误:

如何解决这个问题?

您尝试的语法无效。 async 始终与函数定义一致。

api.get('/users/yop', CORS(CORSOPT), checkauth, async (req, res) => {
  await GETDATA.getUsers(db.collection('users'));
  res.json(users[req.user]);
})

应该可以。如果 checkauth 也包含 await 语句,则将 checkauth 定义 标记为异步。

您需要直接使用关键字将箭头函数声明为async。

api.get('/users/yop', CORS(CORSOPT), checkauth, async (req, res) => {
    await GETDATA.getUsers(db.collection('users'));
    res.json(users[req.user]);
});

将“异步”直接放在您传入的函数前面,而不是对其他函数的引用。如果那些需要异步,当它们自己定义这些函数时,它们可以有自己的声明。

api.get('/users/yop', CORS(CORSOPT), checkauth, async (req, res) => {
  await GETDATA.getUsers(db.collection('users'));
  res.json(users[req.user]);
})

您可以add async回调函数:

api.get('/users/yop', CORS(CORSOPT), checkauth, async (req, res) => {
  await GETDATA.getUsers(db.collection('users'));
  res.json(users[req.user]);
})

此外,如果您出于任何原因想要检查 return 一个承诺,这就是您放置异步的地方:

async function checkauth(req, res, next) {
 ...
 next();
}