Node JS 抛出 UnhandledPromiseRejectionWarning: E​​rror invoking async function in another async function

时间:2021-06-02 20:25:20

标签: javascript node.js express async-await

我正在使用 Node JS 和 Express JS 构建 REST API。

我有一个具有以下功能的 authService.js 文件。

const  verifyVerificationToken = async ({ email, token }) => {
  try {
    let user = await userService.findUserByEmail(email).data

    if (! user) {
      return {
        error: true,
        code: 400,
        message: "Invalid account."
      }
    }

    let tokenModel = await VerificationToken.findOne({
      where: {
        userId: {
          [Op.eq]: user.id
        },
        verificationToken: {
          [Op.eq]: token
        }
      }
    })

    if (! tokenModel) {
      return {
        error: true,
        code: 400,
        message: "Invalid token."
      }
    }

    // check if the token is expired
    let now = new Date();
    if (now.getTime() < tokenModel.expiresAt.getTime()) {
      // check if the token is already verified
      if (tokenModel.verifiedAt) {
        // already verified
        return {
          error: true,
          message: "Token has already been used",
          code: 400
        }
      }

      // update the verifiedAt column
      await VerificationToken.update({
        verifiedAt: now
      }, {
        where: {
          id: {
            [Op.eq]: tokenModel.id
          }
        }
      })

      return {
        error: false
      }
    } else {
        // token is expired
        return {
          error: true,
          code: 400,
          message: "Token been expired."
        }
    }
  } catch (e) {
    return {
      error: true,
      code: 500,
      message: e.message
    }
  }
}

如您所见,它正在调用 userService.js 文件的 findUserByEmail 函数。下面是findUserByEmail函数的实现。

const findUserByEmail = async (email) => {
  try {
    let user = await User.findOne({
      where: {
        email: {
          [Op.eq]: email
        }
      }
    })

    if (user) {
      return {
        error: false,
        data: user
      }
    } else {
      return {
        error: true,
        data: null,
        message: "User not found",
        code: 404
      }
    }
  } catch (e) {
    return {
      error: true,
      message: e.message,
      code: 500
    }
  }
}

当我运行代码时,它从不返回用户,而是在控制台中,我收到以下错误。

(node:7600) UnhandledPromiseRejectionWarning: Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
    at ServerResponse.setHeader (_http_outgoing.js:467:11)
    at ServerResponse.header (C:\Users\Acer\Desktop\collect_api\node_modules\express\lib\response.js:771:10)
    at ServerResponse.send (C:\Users\Acer\Desktop\collect_api\node_modules\express\lib\response.js:170:12)
    at ServerResponse.json (C:\Users\Acer\Desktop\collect_api\node_modules\express\lib\response.js:267:15)
    at login (C:\Users\Acer\Desktop\collect_api\controllers\authController.js:38:19)
    at processTicksAndRejections (internal/process/task_queues.js:88:5)

我的代码有什么问题,我该如何修复?

2 个答案:

答案 0 :(得分:1)

至于错误“从不返回用户”,您应该更改:

 let user = await userService.findUserByEmail(email).data

到:

 let user = (await userService.findUserByEmail(email)).data

答案 1 :(得分:0)

该错误意味着您至少向客户端发送了两次数据。 如果您使用 express,则意味着您多次调用 res.send(或等效的 res.render)。

因此,您没有在问题中提供正确的代码示例,以便我提供更多帮助。