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

时间:2021-04-30 08:58:49

标签: javascript java express

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

    at ServerResponse.setHeader (_http_outgoing.js:558:11)

    at ServerResponse.header (D:\D\Coding\Web Development\Final Project\Face Detection\facerecognitionbrain-api\node_modules\express\lib\response.js:771:10)

    at ServerResponse.send (D:\D\Coding\Web Development\Final Project\Face Detection\facerecognitionbrain-api\node_modules\express\lib\response.js:170:12)

    at ServerResponse.json (D:\D\Coding\Web Development\Final Project\Face Detection\facerecognitionbrain-api\node_modules\express\lib\response.js:267:15)

    at D:\D\Coding\Web Development\Final Project\Face Detection\facerecognitionbrain-api\server.js:57:6

    at Layer.handle [as handle_request] (D:\D\Coding\Web Development\Final Project\Face Detection\facerecognitionbrain-api\node_modules\express\lib\router\layer.js:95:5)

    at next (D:\D\Coding\Web Development\Final Project\Face Detection\facerecognitionbrain-api\node_modules\express\lib\router\route.js:137:13)

    at Route.dispatch (D:\D\Coding\Web Development\Final Project\Face Detection\facerecognitionbrain-api\node_modules\express\lib\router\route.js:112:3)

    at Layer.handle [as handle_request] (D:\D\Coding\Web Development\Final Project\Face Detection\facerecognitionbrain-api\node_modules\express\lib\router\layer.js:95:5)

    at D:\D\Coding\Web Development\Final Project\Face Detection\facerecognitionbrain-api\node_modules\express\lib\router\index.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');

})

这是代码....我在喊什么?

3 个答案:

答案 0 :(得分:1)

在你的代码中你有这个......

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') 并在那一刻抛出错误。

Ex2:当您调用端点时,您输入 else 条件并调用 res.status(400).json('error logging in'); (标头已发送到客户端)。然后你再次调用 res.json('signing') 并在那一刻抛出错误。

你应该删除最后一个 res.json('signing')。

假设您想要发送更多内容,您可能想要发送这样的回复:

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

希望对你有帮助! 如果有人发现更好的答案,请随时发表评论:D

答案 1 :(得分:0)

在 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');

}  

发生错误是因为您在响应已发送后尝试发送响应。

答案 2 :(得分:0)

有问题的代码行:res.json('signing')

为什么会出现问题?:您正尝试向客户端发送 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');