簡體   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