![](/img/trans.png)
[英]this is the error i m getting Error [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.