【问题标题】:Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client in Node JS错误 [ERR_HTTP_HEADERS_SENT]:在 Node JS 中将标头发送到客户端后无法设置标头
【发布时间】:2019-05-31 03:36:17
【问题描述】:

我正在尝试使用不工作但出现上述错误的特定 ID 更新数据。

更新时,我首先在数据库中搜索该特定 ID,然后将数据保存到 MongoDB

这是我的server.js

const express = require('express');
const bodyParser = require('body-parser');
const cors = require('cors');
const mongoose = require('mongoose');

//importing MongoDB model schema
let ToDo = require('./todo.model');

const app = express();
const todoRoutes = express.Router();

const PORT = 4000;

//middlewares
app.use(bodyParser.json());
app.use(cors());
app.use('/todos', todoRoutes);

//connection to the MongoDB database
mongoose.connect('mongodb://127.0.0.1:27017/todos', {useNewUrlParser: true});
const connection = mongoose.connection;
connection.once('open', () =>{
    console.log("Connected to the MongoDB through port: 27017");
 });

app.listen(PORT, () => { 
    console.log(`Listening to port: ${PORT}`);
});

//get all data - removed to show only the code snippet I am getting errors

//get data by an ID - removed to show only the code snippet I am getting errors

//add items to database -removed to show only the code snippet I am getting errors

//update items
todoRoutes.route('/update/:id').post((req, res) => {
    let id = req.params.id;
    ToDo.findById(id, (err, todo) => {
        if(err) throw err;
        if(!todo) res.status(400).send("No data found");

        todo.todo_description = req.body.todo_description;
        todo.todo_responsible = req.body.todo_responsible;
        todo.todo_priority = req.body.todo_priority;
        todo.todo_completed = req.body.todo_completed;
        res.end();

        todo.save().then(todo => {
            res.json(200).send("Data Updated! " + todo);
            res.end();
        }).catch(err => {
            res.status(400).send("Error occured! " + err);
        });
    });
});

这是我遇到的错误...

有人可以帮帮我吗?

【问题讨论】:

    标签: javascript node.js mongodb express mongoose


    【解决方案1】:

    此错误通常意味着您多次发送响应。

    请注意,您一个接一个地发送了两个响应 res.json()res.end()

    如果您出于某种原因只想结束响应,请使用res.end(),否则使用res.status(200).json({ result: ‘Data updated’ + todo })

    如果你同时发送,它会抱怨在发送(通过res.status().json())后尝试修改响应(通过res.end()

    【讨论】:

    • 非常感谢。这就是我要找的:)
    【解决方案2】:

    '/update/:id' 路由中,您发送res.end(),然后在3 行后再次发送。如果您删除第一个res.end(),它应该可以工作。

    如果缺少todo,您还应该return

    todoRoutes.route('/update/:id').post((req, res) => {
        let id = req.params.id;
        ToDo.findById(id, (err, todo) => {
            if(err) throw err;
            if(!todo) return res.status(400).send("No data found");
    
            todo.todo_description = req.body.todo_description;
            todo.todo_responsible = req.body.todo_responsible;
            todo.todo_priority = req.body.todo_priority;
            todo.todo_completed = req.body.todo_completed;
    
            todo.save().then(todo => {
                res.status(200).send("Data Updated! " + todo);
            }).catch(err => {
                res.status(400).send("Error occured! " + err);
            });
        });
    });
    

    【讨论】:

    • 即使在评论之后我仍然收到错误。
    • 我在if(!todo) 语句中添加了一个“return”。这可能是第一组标头被发送的地方。
    • 如果别的博客你可以试试
    • 您确定在运行他的更改之前重新启动了服务器?我也立即注意到了这一点。 @user11436513
    • 我做了一个额外的改变。你发的是res.json(200).send("...");,我改成res.status(200)...
    猜你喜欢
    • 2022-11-03
    • 2020-05-26
    • 2018-09-19
    • 1970-01-01
    • 2020-09-22
    • 2023-01-19
    • 2021-02-26
    • 2021-08-20
    • 2019-09-28
    相关资源
    最近更新 更多