错误[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');
})
这是代码....我在喊什么?
答案 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');