【问题标题】:ExpressJS - Unhandled rejection Error: Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the clientExpressJS - 未处理的拒绝错误:错误 [ERR_HTTP_HEADERS_SENT]:在将标头发送到客户端后无法设置标头
【发布时间】:2020-01-03 06:12:28
【问题描述】:

我能够注册并登录应用程序,但收到以下服务器错误:

“未处理的拒绝错误 [ERR_HTTP_HEADERS_SENT]:在将标头发送到客户端后无法设置标头”注册时。我在这里遇到了类似的问题,但没有一个能解决我的问题。

authController.js:

const User = require("../models/User");
const jwt = require("jsonwebtoken");
const simplecrypt = require("simplecrypt");
const sc = simplecrypt();

process.env.SECRET_KEY = "secret";

exports.postLogin = (req, res, next) => {
  const { username, password } = req.body;
  let validationMessages = [];

  if (!username || !password) {
    validationMessages.push({ message: "Please fill in all fields" });
  }

  if (password.length < 6) {
    validationMessages.push({
      message: "Password should be at least 6 characters"
    });
  }

  if (validationMessages.length > 0) {
    res.sendStatus(403).json(validationMessages);
  } else {
    User.findOne({ where: { username: username } })
      .then(user => {
        if (!user) {
          res.sendStatus(400).json({
            message: "Invalid username or password"
          });
        } else if (password == sc.decrypt(user.password)) {
          const token = jwt.sign(user.dataValues, process.env.SECRET_KEY, {
            expiresIn: 1440 // expires in 24 hours
          });
          res.send(token);
        }
      })
      .catch(err => {
        res.send("Error: " + err);
      });
  }
};

exports.postRegister = (req, res, next) => {
  const { username, password, password2 } = req.body;
  let validationMessages = [];

  //Check required fields
  if (!username || !password || !password2) {
    validationMessages.push({ message: "Please fill in all fields" });
  }

  if (password.length < 6 || password2.length < 6) {
    validationMessages.push({
      message: "Password should be at least 6 characters"
    });
  }

  if (password !== password2) {
    validationMessages.push({
      message: "Passwords do not match"
    });
  }

  if (validationMessages.length > 0) {
    return res.sendStatus(400).json(validationMessages);
  } else {
    User.findOne({ where: { username: username } })
      .then(user => {
        if (user) {
          return res.sendStatus(403).json("User already exists");
        }
        const hashedPassword = sc.encrypt(password);
        User.create({ username: username, password: hashedPassword })
          .then(user => {
            return res.sendStatus(200).send(user);
          })
          .catch(err => {
            throw new Error(err);
          });
      })
      .catch(err => {
        throw new Error(err);
      });
  }
};

exports.getProfile = (req, res, next) => {
  const decoded = jwt.verify(
    req.headers["authorization"],
    process.env.SECRET_KEY
  );
  User.findOne({
    where: {
      id: decoded.id
    }
  })
    .then(user => {
      if (user) {
        res.statusCode(200).json(user);
      } else {
        throw new Error("User does not exist");
      }
    })
    .catch(err => {
      throw new Error(err);
    });
};

我正在使用 Node.JS v12.14.0Express.JS v4.17.1

【问题讨论】:

    标签: node.js express authentication jwt


    【解决方案1】:

    我自己解决了。我的问题是使用 res.sendStatus 设置给定的响应 HTTP 状态代码并将其字符串表示形式作为响应正文发送。 res.json 将设置内容类型响应标头,但有时响应已经发送到客户端。所以简单地 res.send() 应该替换 res.sendStatus()。

    【讨论】:

    • 如果您确实想手动设置状态(这是一个非常好的错误捕获方法!),请使用res.status(whateverStatus).send('errMsg') 或其他方式。
    猜你喜欢
    • 2021-11-30
    • 2020-09-22
    • 2020-05-26
    • 2018-09-19
    • 2021-01-25
    • 2023-01-19
    • 2021-02-26
    • 2021-08-20
    • 2019-09-28
    相关资源
    最近更新 更多