【问题标题】:Cannot set headers after they are sent to the client - error将标头发送到客户端后无法设置标头 - 错误
【发布时间】:2026-01-23 17:50:02
【问题描述】:

错误[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');

})

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

【问题讨论】:

  • 在发送响应时如果条件使用返回

标签: javascript java express


【解决方案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。

Ex1: 当您调用端点时,您输入 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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      有问题的代码行: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');
      

      【讨论】:

        最近更新 更多