Можем ли мы использовать async / await на Express обработчиках запросов - PullRequest
0 голосов
/ 20 марта 2020

Я занимаюсь очисткой кода. Я работаю над NodeJS, Express REST API. Например, у меня есть такой API:

app.get('/getKeys', isLoggedIn, async(req, res) => {
  var decoded = jwt.decode(res.locals.newToken);
  req.body.profileID = decoded.profileID
  let profileID = decoded.profileID
  req.body.sessionID = req.cookies.sessionID
    .then(async(response) => {
      await pro.sendData(profileID, 'Fetched', {
        profileID,
        keysFetched: true
      })
      console.log(response.data)
      res.cookie('userToken', res.locals.newToken, {
        httpOnly: true,
        sameSite: 'Strict',
        secure: true,
        domain: 'example.com'
      })
      return res.status(200).send(apiResponse.sendReply(1, 'got KEys', {
        data: response.data.data
      }))
    })
    .catch(err => {
      console.log(err.response.data);
      res.cookie('userToken', res.locals.newToken, {
        httpOnly: true,
        sameSite: 'Strict',
        secure: true,
        domain: 'example.com'
      })
      return res.status(500).send(apiResponse.sendReply(1021, 'redirct to login'))
    })
});

Для удобства чтения и понятного кода, я пытаюсь использовать asyn c await вместо обещаний. Я использовал await для метода post, удалил await из pro.sendData и попытался поместить все в блоки try catch. Я не знаю, правильно это или неправильно. Это мой новый код.

app.get('/getKeys', isLoggedIn, async(req, res) => {
  try {
    var decoded = jwt.decode(res.locals.newToken);
    req.body.profileID = decoded.profileID
    let profileID = decoded.profileID
    req.body.sessionID = req.cookies.sessionID
    const data = await transport.post(postOffice.SENTRY + '/getKeys', req.body);
    pro.sendData(profileID, 'Fetched', {
      profileID,
      keysFetched: true
    });
    console.log(data);
    res.cookie('userToken', res.locals.newToken, {
      httpOnly: true,
      sameSite: 'Strict',
      secure: true,
      domain: 'example.com'
    });
    return res.status(200).send(apiResponse.sendReply(1, 'got Keys', {
      data: data
    }))
  } catch (err) {
    console.log(err.data);
    res.cookie('userToken', res.locals.newToken, {
      httpOnly: true,
      sameSite: 'Strict',
      secure: true,
      domain: 'example.com'
    });
    return res.status(500).send(apiResponse.sendReply(1021, 'redirct to login'));
  }
});

1 Ответ

1 голос
/ 20 марта 2020

Да, вы можете. async / await - это просто синтактика c сахар.

(Если вы не можете, ваши тесты поймают это. У вас есть тесты, не так ли?)

В вашем "оригинальном" коде, похоже, отсутствует вызов const data = await transport.post(postOffice.SENTRY + '/getKeys', req.body);, но, добавив его обратно, автоматы PyCharm c "convert to asyn c" дают мне следующее, что более или менее соответствует вашим ожиданиям.

app.get('/getKeys', isLoggedIn, async (req, res) => {
  const decoded = jwt.decode(res.locals.newToken);
  req.body.profileID = decoded.profileID;
  const profileID = decoded.profileID;
  req.body.sessionID = req.cookies.sessionID;
  try {
    const response = await transport.post(postOffice.SENTRY + '/getKeys', req.body);
    await pro.sendData(profileID, 'Fetched', {
      profileID,
      keysFetched: true,
    });
    console.log(response.data);
    res.cookie('userToken', res.locals.newToken, {
      httpOnly: true,
      sameSite: 'Strict',
      secure: true,
      domain: 'example.com',
    });
    return res.status(200).send(apiResponse.sendReply(1, 'got KEys', {
      data: response.data.data,
    }))
  } catch (err) {
    console.log(err.response.data);
    res.cookie('userToken', res.locals.newToken, {
      httpOnly: true,
      sameSite: 'Strict',
      secure: true,
      domain: 'example.com',
    });
    return res.status(500).send(apiResponse.sendReply(1021, 'redirct to login'));
  }
});
...