繁体   English   中英

ExpressJS - 未处理的拒绝错误:错误 [ERR_HTTP_HEADERS_SENT]:发送到客户端后无法设置标头

[英]ExpressJS - Unhandled rejection Error: Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client

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

注册时出现“未处理的拒绝错误 [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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM