簡體   English   中英

登錄時出現錯誤 [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client

[英]When loging in I get Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client

抱歉,這是我第一次嘗試做后端,這可能是一個愚蠢的問題。 我有一個 index.js 像這樣:

const express = require('express')
const app = express();
const mongoose = require('mongoose')
const dotenv = require('dotenv')
const userRoute = require('./routes/user')
const authRoute = require('./routes/auth')

const PORT = process.env.PORT || 5000

dotenv.config()

mongoose
    .connect(process.env.MONGO_URL)
    .then(() => console.log('db connection succesful'))
    .catch((err) => {
        console.log(err)
    })

app.use(express.json())
app.use('/api/auth', authRoute)
app.use('/api/users', userRoute)

app.listen(PORT, () =>{
    console.log(`backend server is running! on ${PORT}`)
})

我的 auth.js 看起來像:

const router = require("express").Router();
const User = require("../models/User");
const CryptoJS = require("crypto-js");

//REGISTER
router.post("/register", async (req, res) => {
  const newUser = new User({
    username: req.body.username,
    email: req.body.email,
    password: req.body.password,
  });

  try {
    const savedUser = await newUser.save();
    res.status(201).json(savedUser);
  } catch (err) {
    res.status(500).json(err);
  }
});

//LOGIN

router.post('/login', async (req, res) => {
    try{
        const user = await User.findOne({ username: req.body.username });

        !user && res.status(401).json("Wrong User Name");

        password = user.password

        password !== req.body.password && res.status(401).json("Wrong credentials!");

        res.status(200).json(user)

    } catch(err) {
        res.status(500).json(err);
    }

});

module.exports = router;

並且不確定這是否相關,但我的 User.js 是這樣的:

const mongoose = require("mongoose");

const UserSchema = new mongoose.Schema(
  {
    username: { type: String, required: true, unique: true },
    email: { type: String, required: true, unique: true },
    password: { type: String, required: true },
    isAdmin: {
      type: Boolean,
      default: false,
    },
  },
  { timestamps: true }
);

module.exports = mongoose.model("User", UserSchema);

我將 JSON object 發送到我的注冊路線:

{“用戶名”:“測試”,“電子郵件”:“100@gmail.com”,“密碼”:123456 }

哪個有效。 發布到 http://localhost:5000/api/auth/register 時,我在正文中收到以下響應:

{
    "username": "test",
    "email": "100@gmail.com",
    "password": "123456",
    "isAdmin": false,
    "_id": "62fd49a6baa5717b67a885df",
    "createdAt": "2022-08-17T20:03:50.776Z",
    "updatedAt": "2022-08-17T20:03:50.776Z",
    "__v": 0
}

但是當我嘗試將 object 發布到我的登錄名(http://localhost:5000/api/auth/login)時:

{
    "username": "test",
    "password": "123456"
}

我收到以下錯誤:

~/code/IaaS/app$ npm start

> app@0.1.0 start
> nodemon index.js

[nodemon] 2.0.19
[nodemon] to restart at any time, enter `rs`
[nodemon] watching path(s): *.*
[nodemon] watching extensions: js,mjs,json
[nodemon] starting `node index.js`
backend server is running! on 5000
db connection succesful
node:internal/errors:465
    ErrorCaptureStackTrace(err);
    ^

Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
    at new NodeError (node:internal/errors:372:5)
    at ServerResponse.setHeader (node:_http_outgoing:576:11)
    at ServerResponse.header (/home/a7dc/code/IaaS/app/node_modules/express/lib/response.js:794:10)
    at ServerResponse.send (/home/a7dc/code/IaaS/app/node_modules/express/lib/response.js:174:12)
    at ServerResponse.json (/home/a7dc/code/IaaS/app/node_modules/express/lib/response.js:278:15)
    at /home/a7dc/code/IaaS/app/routes/auth.js:37:25
    at processTicksAndRejections (node:internal/process/task_queues:96:5) {
  code: 'ERR_HTTP_HEADERS_SENT'
}
[nodemon] app crashed - waiting for file changes before starting...

我究竟做錯了什么?

感謝 Ariel 的回答。 我已將代碼更新為以下內容:

//LOGIN

router.post('/login', async (req, res) => {
    try{
        const user = await User.findOne({ username: req.body.username });

        !user && res.status(401).json("Wrong User Name");
 
        password = user.password

        password !== req.body.password && res.status(401).json("Wrong credentials!");

        
        if (password !== req.body.password) {
            return res.status(401).json("Wrong credentials!");
         } else {
            return res.status(200).json(user)
         }

    } catch(err) {
        console.log('error')
        return res.status(500).json(err);
    }

});

module.exports = router;

這給出了錯誤:

[nodemon] restarting due to changes...
[nodemon] starting `node index.js`
backend server is running! on 5000
db connection succesful
error
node:internal/errors:465
    ErrorCaptureStackTrace(err);
    ^

Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
    at new NodeError (node:internal/errors:372:5)
    at ServerResponse.setHeader (node:_http_outgoing:576:11)
    at ServerResponse.header (/home/a7dc/code/IaaS/app/node_modules/express/lib/response.js:794:10)
    at ServerResponse.send (/home/a7dc/code/IaaS/app/node_modules/express/lib/response.js:174:12)
    at ServerResponse.json (/home/a7dc/code/IaaS/app/node_modules/express/lib/response.js:278:15)
    at /home/a7dc/code/IaaS/app/routes/auth.js:42:32
    at processTicksAndRejections (node:internal/process/task_queues:96:5) {
  code: 'ERR_HTTP_HEADERS_SENT'
}
[nodemon] app crashed - waiting for file changes before starting...

問題是您發送了兩次響應(發送響應時程序沒有停止)。 在這里,您發送狀態為 401 的響應,然后發送狀態為 200 的響應。

        password !== req.body.password && res.status(401).json("Wrong credentials!");

    res.status(200).json(user)

可能,如果密碼不同,您想發送 401,否則發送 200

            if (password !== req.body.password) {
               res.status(401).json("Wrong credentials!");
            } else {
               res.status(200).json(user)
            }

或者,也許只是在發送響應時“返回”。 例子:

return res.status(XXX).json({ something: "something})

“發送到客戶端后無法設置標頭”意味着已經發送了一個響應,因此您無法再次設置標頭。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM