JavaScript:赶上来不要停止代码

时间:2018-08-21 14:04:11

标签: javascript try-catch

为我的英语不好而感到抱歉。我正在学习JavaScript,并且Google O2Auth有点问题,在我的节点服务器中,当Google令牌无效或过期时,我尝试停止代码,但是在catch中的“ return”发送http响应,而我可以在Postman中看到它,但是代码继续执行,如果要停止捕获之外的代码,我必须放一个糟糕的东西。

代码在这里

// The google code for NodeJS
async function verify(token) {
  var ticket = await client.verifyIdToken({
      idToken: token,
      audience: GOOGLE_CLIENT_ID
  });

  var payload = ticket.getPayload();

  return {
    nombre: payload.name,
    email: payload.email,
    img: payload.picture,
    google: true
  }
}

// My code
app.post('/google', async (req, res) => {
  var token = req.body.token;

  // Here is the problem, in the .catch i put a return 403... but the code don't stop and enter in the Usuario.FindOne.
  var googleUser = await verify(token).catch(err => {
    return res.status(403).json({
      ok: false,
      mensaje: 'Token de google inválido',
      errors: { message: 'Token de google inválido' }
    });
  });

  Usuario.findOne({ email: googleUser.email }, (err, usuario) => {
    if (err) {
      return res.status(500).json({
        ok: false,
        ...
        ...
        ...

问题是代码不会在返回的“状态403”中停止,在该函数输入findOne函数之后,如果发现任何错误,就会停止代码...

当令牌无效(因为没有收到电子邮件)而没问题时,但是当令牌过期时,我会收到一封电子邮件,并且我的节点服务器崩溃!

问题是,我需要破坏verify(token).catch()中的代码吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

您只有return从回调函数传递到了其中的catch方法。这不会阻止其他任何事情。

请改用try / catch,其中return将从async function中退出:

app.post('/google', async (req, res) => {
  var token = req.body.token;

  try {
    var googleUser = await verify(token);
  } catch (err) {
    res.status(403).json({
      ok: false,
      mensaje: 'Token de google inválido',
      errors: { message: 'Token de google inválido' }
    });
    return;
  }
  try {
    var usuario = await new Promise((resolve, reject) => {
      Usuario.findOne({ email: googleUser.email }, (err, usuario) => {
        if (err) reject(err);
        else resolve(usario);
      });
    });
  } catch(err) {
    return res.status(500).json({
      ok: false,
      …