Ошибка [ERR_HTTP_HEADERS_SENT]: невозможно установить заголовки после их отправки клиенту в узле JS - PullRequest
0 голосов
/ 30 мая 2019

Я пытаюсь обновить данные с помощью определенного идентификатора, который не работает, но выдает ошибку выше.

При обновлении сначала я ищу в базе данных этот конкретный идентификатор, а затем сохраняю данные в 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);
        });
    });
});

Это ошибка, которую я получаю ...

Error

Может кто-нибудь помочь мне?

Ответы [ 2 ]

1 голос
/ 30 мая 2019

Эта ошибка обычно означает, что вы отправляете ответ более одного раза.

Обратите внимание, что вы отправляете два ответа один за другим res.json() и res.end()

Если вы хотите по какой-то причине просто завершить ответ, используйте res.end(), в противном случае используйте res.status(200).json({ result: ‘Data updated’ + todo })

Если вы отправите оба сообщения, он будет жаловаться на попытку изменить ответ (через res.end()) после его отправки (через res.status().json())

1 голос
/ 30 мая 2019

На маршруте '/update/:id' вы отправляете res.end(), а затем делаете это снова через 3 строки. Если вы удалите первый res.end(), он должен работать.

Вы также должны return, если todo отсутствует:

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);
        });
    });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...