首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >错误[ERR_HTTP_HEADERS_SENT]:在Node JS中头发送到客户端后无法设置

错误[ERR_HTTP_HEADERS_SENT]:在Node JS中头发送到客户端后无法设置
EN

Stack Overflow用户
提问于 2019-05-31 03:16:29
回答 2查看 498关注 0票数 0

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

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

这是我的server.js

代码语言:javascript
复制
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);
        });
    });
});

这就是我得到的错误...

有人能帮帮我吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-05-31 03:34:52

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

注意,您发送了两个响应,一个是res.json(),另一个是res.end()

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

如果两个都发送,它会抱怨在发送(通过res.status().json())之后试图修改响应(通过res.end())。

票数 1
EN

Stack Overflow用户

发布于 2019-05-31 03:20:49

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

如果缺少todo,您还应该执行return

代码语言:javascript
复制
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);
        });
    });
});
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56384359

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档