将标头发送到客户端后无法设置标头-错误



错误[ERR_HTTP_HEADERS_SENT]:将标头发送到客户端后无法设置标头

at ServerResponse.setHeader (_http_outgoing.js:558:11)
at ServerResponse.header (D:DCodingWeb DevelopmentFinal ProjectFace Detectionfacerecognitionbrain-apinode_modulesexpresslibresponse.js:771:10)
at ServerResponse.send (D:DCodingWeb DevelopmentFinal ProjectFace Detectionfacerecognitionbrain-apinode_modulesexpresslibresponse.js:170:12)
at ServerResponse.json (D:DCodingWeb DevelopmentFinal ProjectFace Detectionfacerecognitionbrain-apinode_modulesexpresslibresponse.js:267:15)
at D:DCodingWeb DevelopmentFinal ProjectFace Detectionfacerecognitionbrain-apiserver.js:57:6
at Layer.handle [as handle_request] (D:DCodingWeb DevelopmentFinal ProjectFace Detectionfacerecognitionbrain-apinode_modulesexpresslibrouterlayer.js:95:5)
at next (D:DCodingWeb DevelopmentFinal ProjectFace Detectionfacerecognitionbrain-apinode_modulesexpresslibrouterroute.js:137:13)
at Route.dispatch (D:DCodingWeb DevelopmentFinal ProjectFace Detectionfacerecognitionbrain-apinode_modulesexpresslibrouterroute.js:112:3)
at Layer.handle [as handle_request] (D:DCodingWeb DevelopmentFinal ProjectFace Detectionfacerecognitionbrain-apinode_modulesexpresslibrouterlayer.js:95:5)
at D:DCodingWeb DevelopmentFinal ProjectFace Detectionfacerecognitionbrain-apinode_modulesexpresslibrouterindex.js:281:22
const express = require('express');
const bodyParser = require('body-parser');
const bcrypt = require('bcrypt-nodejs');
const app = express();
app.use(bodyParser.json());
const database = {
users: [
{
id: '123',
name: 'John',
email: 'john@gmail.com',
entries: 0,
joined: new Date()
},
{
id: '124',
name: 'sally',
email: 'sally@gmail.com',
entries: 0,
joined: new Date()
}
],
login: [{
id: '987',
hash: '',
email: 'john@gmail.com'
}]
}
app.get('/', (req,res) =>{
res.send(database.users);
})

app.post('/signin', (req, res)=>{
bcrypt.compare("apple", '$2a$10$r145GrmmFJAaiRF3Gn3eEuTRS69chhTOYS9sAhiACyiV7oe/vbFyO', function(err, res) {
console.log('first guess', res);
});
bcrypt.compare("veggies", '$2a$10$r145GrmmFJAaiRF3Gn3eEuTRS69chhTOYS9sAhiACyiV7oe/vbFyO', function(err, res) {
console.log('second guess', res);
});

if(req.body.email === database.users[0].email &&
req.body.password === database.users[0].password){
res.json('success');
}
else{
res.status(400).json('error logging in');
}
res.json('signing')
})

app.post('/register', (req,res)=>{
const {email, name, password} = req.body;

bcrypt.hash(password, null, null, function(err, hash) {
console.log(hash);
});
database.users.push({
id: '125',
name: name,
email: email,
password: password,
entries: 0,
joined: new Date()
})
res.json(database.users[database.users.length - 1]);
})

app.get('/profile/:id', (req,res)=>{
const{ id } = req.params;
let found = false;
database.users.forEach(users =>{
if(users.id === id){
found = true;
return res.json(users);
}
})
if(!found){
req.status(400).json('not found')
}
})

app.post('/image', (req,res) => {
const{ id } = req.body;
let found = false;
database.users.forEach(users =>{
if(users.id === id){
found = true;
users.entries++;
return res.json(users.entries);
}
})
if(!found){
res.status(400).json('not found')
}
})
app.listen(3000, ()=>{
console.log('app is running on port 3000');
})

这就是代码。。。。我喊什么?

在您的代码中,您有。。。

if(req.body.email === database.users[0].email && req.body.password === database.users[0].password){
res.json('success');
} 
else {
res.status(400).json('error logging in');
}
res.json('signing')

你的错误显示

错误[ERR_HTTP_HEADERS_SENT]:在将标头发送到客户端后无法设置标头

发生这种情况是因为您调用了res.json或res.status.两次

示例1:当您调用端点时,您输入if条件,然后调用res.json("success"(;(标头已发送到客户端(。然后你再次调用res.json('signing'(,在那一刻,错误被抛出。

示例2:当您调用端点时,您输入else条件,然后调用res.status(400(.json("错误登录"(;(标头已发送到客户端(。然后你再次调用res.json('signing'(,在那一刻,错误被抛出。

您应该删除最后一个res.json("签名"(。

想象一下,你想发送更多的东西,你可能想发送这样的回复:

res.json({message:'success', x:'signing'})
// or
res.status(400).json({error: 'error logging in', x: 'signing'})

希望这有帮助!如果有人发现了更好的东西,这个答案可以自由评论:D

在if条件中,发送响应时使用return。示例如下。

if(req.body.email === database.users[0].email && req.body.password === database.users[0].password){
return res.json('success');
} else {
return res.status(400).json('error logging in');
}  

发生此错误是因为您试图在发送响应之后再发送响应。

有问题的代码行:res.json("签名"(

为什么这是一个问题?:您正试图为1个请求向客户端发送2个响应。

正在发送的第一个响应在您的条件语句中,它设置了标头(例如,如果成功,则设置响应状态200等(,在执行条件语句后,上面突出显示的行尝试向客户端发送另一个响应,并再次设置标头,因此出现错误消息(在将标头发送到客户端后无法设置标头(

你可以试试下面的建议:

if (
req.body.email === database.users[0].email &&
req.body.password === database.users[0].password
) {
return res.status(200).json({
title: 'Success',
message: 'Signing',
});
}
return res.status(400).json('error logging in');

最新更新