Muszę użyć await wewnątrz trasy w Express, dlatego musi to być async. Jednak gdy próbuję dodać async do trasy, to nie działa, ponieważ używam oprogramowania pośredniczącego.

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

Oprogramowanie pośredniczące wygląda tak:

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

Jeśli async i checkout są oddzielone przecinkami, jak w kodzie, który opublikowałem, pojawia się ten błąd: await is only valid in async function

Jeśli nie są oddzielone przecinkami, mój edytor kodu oznacza to jako błąd składni: tu wpisz opis obrazu

Jak to naprawić?

0
user10021033 9 czerwiec 2021, 18:14

4 odpowiedzi

Najlepsza odpowiedź

Składnia, której próbujesz, jest nieprawidłowa. async zawsze odpowiada definicji funkcji.

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

Powinno działać. Jeśli checkauth również zawiera wyrażenia await, oznacz definicję checkauth jako asynchroniczną.

4
Siddharth 9 czerwiec 2021, 15:19

Musisz zadeklarować funkcję strzałki jako asynchroniczną bezpośrednio przy użyciu słowa kluczowego.

api.get('/users/yop', CORS(CORSOPT), checkauth, async (req, res) => {
    await GETDATA.getUsers(db.collection('users'));
    res.json(users[req.user]);
});
0
Ian H. 9 czerwiec 2021, 15:19

Umieść "async" bezpośrednio przed funkcją, którą przekazujesz, a nie odwołania do innych funkcji. Jeśli te funkcje potrzebują asynchronii, mogą mieć własne deklaracje, gdy te funkcje są definiowane samodzielnie.

api.get('/users/yop', CORS(CORSOPT), checkauth, async (req, res) => {
  await GETDATA.getUsers(db.collection('users'));
  res.json(users[req.user]);
})
0
byte-this 9 czerwiec 2021, 15:19

Możesz dodać async do funkcji wywołania zwrotnego :

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

Również jeśli chcesz, aby checkauth zwrócił obietnicę z jakiegokolwiek powodu, tutaj umieszczasz asynchronię:

async function checkauth(req, res, next) {
 ...
 next();
}
0
Fabio Lopez 9 czerwiec 2021, 15:20