Javascript 如何解决节点上未处理的PromisejectionWarning?

Javascript 如何解决节点上未处理的PromisejectionWarning?,javascript,node.js,express,Javascript,Node.js,Express,我正在尝试制作一个用于学习目的的API。API没有问题。我得到了我想要的回应。但问题是,当我查看终端时,我会得到如下错误: 未处理的PromisejectionWarning:未处理的承诺拒绝。此错误源于在没有catch块的异步函数中抛出,或者拒绝未使用.catch()处理的承诺 它警告我未处理权限拒绝将终止Node.js 控制台日志 (node:8721) UnhandledPromiseRejectionWarning: Error [ERR_HTTP_HEADERS_SENT]: Can

我正在尝试制作一个用于学习目的的API。API没有问题。我得到了我想要的回应。但问题是,当我查看终端时,我会得到如下错误:

未处理的PromisejectionWarning:未处理的承诺拒绝。此错误源于在没有catch块的异步函数中抛出,或者拒绝未使用.catch()处理的承诺

它警告我未处理权限拒绝将终止Node.js

控制台日志

 (node:8721) UnhandledPromiseRejectionWarning: Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
    at ServerResponse.setHeader (_http_outgoing.js:526:11)
    at ServerResponse.header (/backend/node_modules/express/lib/response.js:771:10)
    at ServerResponse.send (/backend/node_modules/express/lib/response.js:170:12)
    at ServerResponse.json (/backend/node_modules/express/lib/response.js:267:15)
    at exports.apiFormat (/backend/handlers/errorHandlers.js:85:21)
    at /backend/middlewares/auth.js:31:11
    at allFailed (/backend/node_modules/passport/lib/middleware/authenticate.js:107:18)
    at attempt (/backend/node_modules/passport/lib/middleware/authenticate.js:180:28)
    at Strategy.strategy.fail (/backend/node_modules/passport/lib/middleware/authenticate.js:302:9)
    at verified (/backend/node_modules/passport-local/lib/strategy.js:82:30)
    at /backend/middlewares/passport.js:69:24
    at processTicksAndRejections (internal/process/task_queues.js:97:5)
(node:8721) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 1)
(node:8721) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
我使用相同的json resonse格式api。 (errorHandlers.js)

使用passport.js进行身份验证的中间件 auth.js

exports.apiFormat = (statusCode, responseCode, message, success, data, res) => {
  try {
    return res.status(statusCode).json({
      message: message,
      success: Boolean(success),
      data: data,
      status: Number(responseCode),
    });
  } catch (error) {
    res.status(500).json({
      message: "Internal Server Error",
    });
  }
};
exports.login = async (req, res, next) => {
  try {
    await validateField(req, res);
    await passport.authenticate("login", async (err, user) => {
      if (err || !user) {
        apiFormat(
          process.env.UNAUTORIZED_CODE,
          process.env.FAILURE_RESPOSNE_CODE,
          "Authentication Failed.",
          false,
          null,
          res
        );
      }
      try {
        req.login(user, { session: false }, (err) => {
          if (err) {
            apiFormat(
              process.env.UNAUTORIZED_CODE,
              process.env.FAILURE_RESPOSNE_CODE,
              "Authentication Failed.",
              false,
              null,
              res
            );
          }
          const tokenData = {
            id: user.id,
            name: user.name,
            email: user.email,
            role: user.role,
          };

          const accessToken = jwt.sign(
            tokenData,
            "access_token",
            {
              expiresIn: "8h",
            }
          );
          tokenData.accessToken = accessToken;
          req.tokenData = tokenData;
        });
      } catch (error) {
        next(error);
      }
      next();
    })(req, res, next);
  } catch (error) {
    next(error);
  }
  //Validate Userinput Field
};
const { validationResult } = require("express-validator");
const { apiFormat } = require("../handlers/errorHandlers");
exports.validateField = async (req, res) => {
  try {
    const errors = await validationResult(req);
    const extractedErrors = [];
    if (!errors.isEmpty()) {
      errors
        .array({ onlyFirstError: true })
        .map((err) => extractedErrors.push(err.msg));
    }
    if (extractedErrors.length > 0)
      await apiFormat(
        process.env.UNPROCESSABLE_ENTITY_CODE,
        process.env.FAILURE_RESPOSNE_CODE,
        extractedErrors[0],
        false,
        null,
        res
      );
  } catch (err) {
    res.status(500).json({
      message: "Internal Server Error",
    });
  }
};
我使用express validator验证post数据

验证字段(请求、回复)

passport.js:

passport.use(
    "login",
    new LocalStrategy(
      {
        usernameField: "email",
        passwordField: "password",
        session: false,
      },
      (email, password, done) => {
        try {
          User.findOne({
            email: email,
          })
            .then((user) => {
              if (user === null) {
                return done(null, false);
              }
              bcrypt.compare(password, user.password).then((response) => {
                if (response !== true) {
                  return done(null, false);
                }
                return done(null, user);
              });
            })
            .catch((err) => {
              return done(err);
            });
        } catch (err) {
          return done(err);
        }
      }
    )
  );
Api路线

router.post(
  "/login",
  validator.loginUser,
  auth.login,
  catchErrors(userController.login)
);
验证程序.登录用户

exports.loginUser = [
  check("email")
    .exists()
    .withMessage("Email is required")
    .isEmail()
    .normalizeEmail()
    .withMessage("Please insert a valid Email"),
  check("password")
    .not()
    .isEmpty()
    .withMessage("Password is required")
    .isLength({ min: 8 })
    .withMessage("Please enter password with minimum 8 character")
    .trim()
    .escape(),
];
你能告诉我哪里错了吗?为什么我会收到这样一个未经处理的错误PromisejectionWarning

validationResult()
返回结果对象,但不返回承诺。您正在使用
wait
等待承诺对象

从代码中删除
wait
,以防止出现错误:

const errors = validationResult(req);

// .. and your error variable will have arrays of error.

参考链接:此链接帮助我