Ошибка при создании контактов с помощью mongodb - Невозможно установить заголовки после их отправки - PullRequest
0 голосов
/ 04 сентября 2018

При попытке создать контакты с помощью моего приложения я получаю следующую ошибку

Error: Can't set headers after they are sent.
    at validateHeader (_http_outgoing.js:491:11)
    at ServerResponse.setHeader (_http_outgoing.js:498:3)
    at ServerResponse.header (/home/bas/Desktop/node-backed/node_modules/express/lib/response.js:767:10)
    at ServerResponse.json (/home/bas/Desktop/node-backed/node_modules/express/lib/response.js:264:10)
    at /home/bas/Desktop/node-backed/routes/route.js:8:18
    at /home/bas/Desktop/node-backed/node_modules/mongoose/lib/model.js:4437:16
    at process.nextTick (/home/bas/Desktop/node-`    `backed/node_modules/mongoose/lib/helpers/query/completeMany.js:35:39)
    at _combinedTickCallback (internal/process/next_tick.js:131:7)
    at process._tickCallback (internal/process/next_tick.js:180:9)

Это мой код app.js

var express= require('express'); 
var mongoose= require('mongoose');
var bodyparser=require('body-parser'); 
var cors= require('cors');
var path= require('path');

var app= express();

const route= require('./routes/route');

mongoose.connect('mongodb://localhost:27017/contactlist');
mongoose.connection.on('connected',function(){
    console.log('Connected to database mongodb @ 27017'); });

app.use(cors()); app.use(bodyparser.json());
app.use(express.static(path.join(__dirname,'public')));

app.use('/api',route);

app.get('/',function(req,res){
        res.send('home'); 
}) 

app.listen(8080, function(req,res){     
    console.log('Running'); 
});

/*  https://www.youtube.com/watch?v=wtIvu085uU0 */

Это мой код router.js

const express = require('express'); const router= express.Router();
const Contact = require('../models/contact');

router.get('/contacts', function(req, res, next) {
       res.send('Retrieving the contact list')
       Contact.find(function(err, contacts) {
             res.json(contacts);
       }); 
});

router.post('/contact', function(req, res, next) {    
    let newContact = new Contact({
        first_name:req.body.first_name,
        last_name:req.body.last_last,
        phone:req.body.phone      
    })    

    newContact.save(function(err, contacts) {
        if(err) {
            res.json({ msg: 'Failed to add contact' });
        }
        else {
            res.json({ msg: 'Contact added successfuly' });
        }

   });
   res.send('Post of contacts'); 
});

router.delete('/contacts/:id', function(req, res, next) {    
    Contact.remove({ _id: req.params.id }, function(err, result) {
        if(err){
            res.json(err)
        }
        else {
            res.json(result);
        }   
    })
});

module.exports=router;

Это мой код contact.js

const mongoose= require('mongoose'); const  ContactSchema =
mongoose.Schema({
     first_name:{
        type:String,
        require:true
     },
     last_name:{
        type:String,
        require:true
     },
     phone:{
        type:String,
        require:true
     } });

const Contact = module.exports = mongoose.model('Contact',ContactSchema);

Когда я получаю доступ к URL http://localhost:8080/api/contact, отображается следующая ошибка

events.js:183
      throw er; // Unhandled 'error' event
      ^

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

Ошибка: невозможно установить заголовки после их отправки.

Вы получаете эту ошибку, потому что ваш обработчик GET дважды отправляет ответ клиенту.

router.get('/contacts', function(req, res, next) {
       res.send('Retrieving the contact list') // sending response here once
       Contact.find(function(err, contacts) {
             res.json(contacts); //attempting to send again
       }); 
});

Вы должны отправлять ответ клиенту только один раз.

router.get('/contacts', function (req, res, next) {
  Contact.find(function (err, contacts) {
    if (err) {
      return res.json({
        msg: err
      });
    }

    res.json({
      msg: 'Retrieving the contact list',
      contacts: contacts
    });
  });
});
0 голосов
/ 04 сентября 2018

Вы должны определить ваше промежуточное программное обеспечение, прежде чем определять маршруты к узлу, поэтому переместите эти строки:

  app.use(cors()); app.use(bodyparser.json()); 
  app.use(express.static(path.join(__dirname,'public')));

после того, как вы определили свое приложение и перед определением const route = require ('./ маршруты / route'); и обратите внимание на другое: лучше использовать обещания для результатов запроса, например, когда вы сохраняете свою модель, пишите:

 newContact.save().then(()=> res.json('success')}).catch((err)=>{..handle error})

или в вашем запросе поиска:

 Contact.find({your ciritica}).then((contacts)=> res.json(contacts)).catch((err)=>{})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...