2014-01-30 3 views
3

Здравствуйте, я делаю простое приложение с использованием стека MEAN. И я получаю эту http.js ошибки: 691 певд Error ('Can \' т установить заголовки после их отправки.)Node.js: http.js: 691 throw new Error ('Can ' t установить заголовки после их отправки.)

Вот код: server.js

// set up 
var express = require('express'); 
var app = express(); 
var mongoose = require('mongoose'); 

// mongodb connection and app configuration 
mongoose.connect('mongodb://localhost/test'); 

app.configure(function() { 
    app.use(express.static(__dirname + '/app')); 
    app.use(express.logger('dev')); 
    app.use(express.bodyParser()); 
    app.use(express.methodOverride()); 
}); 

// define model 
var Employee = mongoose.model('Employee', { 
    firstName : String, 
    lastName : String, 
    photoUrl : String 
}); 

// routes ========================== 
// api 
// GET 
app.get('/api/employees', function(req, res) { 
    console.log("GET"); 
    Employee.find(function(err, employees) { 
     if(err) { 
      res.send(err); 
     } 

     res.json(employees); 
    }); 
}); 

// Get by ID 
app.get('/api/employees/:employeeId', function(req, res) { 
    Employee.findById(req.params.employeeId, function(err, employee) { 
     if(err) { 
      res.send(err); 
     } 

     res.json(employee); 
    }); 
    Employee.find(function(err, employees) { 
     if(err) { 
      res.send(err); 
     } 

     res.json(employees); 
    }); 
}); 

// POST 
app.post('/api/employees', function(req, res) { 
    Employee.create({ 
     firstName : req.body.firstName, 
     lastName : req.body.lastName, 
     photoUrl : req.body.photoUrl 
    }, function(err, employee) { 
     if(err) { 
      res.send(err); 
     } 
     Employee.find(function(err, employees){ 
      if(err) { 
       res.send(err); 
      } 
      res.json(employees); 
     }); 
    }); 
}); 

// DELETE 
app.delete('/api/employees/:employee_id', function(req, res) { 
    Employee.remove({_id : req.params.employee_id}, function (err, employee) { 
     if(err) { 
      res.send(err); 
     } 

     Employee.find(function(err, employees) { 
      if(err) { 
       res.send(err); 
      } 
      res.json(employees); 
     }) 
    }); 
}); 

// application 
app.get('*', function(req, res) { 
    res.sendfile('./app/index.html'); 
}); 

// start listening (start app) 
app.listen(8080); 
console.log("App listening on port 8080"); 

А также : app.js Угловые маршруты

var employeesApp = angular.module('employeesApp', [ 
    'ngRoute', 
    'EmployeesControllers', 
    'employeeAppAnimations' 
]); 

employeesApp.config(['$routeProvider', 
    function($routeProvider) { 
     $routeProvider. 
      when('/employees', { 
       templateUrl: 'partials/employees_list.html', 
       controller: 'EmployeesCtrl' 
      }). 
      when('/employees/:employeeId', { 
       templateUrl: 'partials/employees_details.html', 
       controller: 'EmployeeDetailsCtrl' 
      }). 
      otherwise({ 
       redirectTo: '/employees' 
      }); 
    }]); 

ответ

8

В

app.get('/api/employees/:employeeId', function() {...}); 

вы используете res.j сына дважды. Предположим, что Employee.findById сначала возвращает результаты. Тогда

res.json(employee) 

уже отправлен. Затем код вводит обратный вызов Employee.find с небольшой задержкой. Это снова вызывает res.json(). Но поскольку ответ на ваш запрос уже отправлен, он не может отправить другой ответ на тот же запрос.

Это условие вызывает ошибку.

Существует два способа решить эту проблему.

  1. Вложенные обратные вызовы - вызов Employee.find внутри Employee.findById callback.
  2. Добавить условия в обоих обратных вызовах, чтобы проверить, завершен ли другой обратный вызов. Затем отправьте один ответ.
+0

Спасибо большое, это сработало, вы мне очень помогли :) – nikolakoco

Смежные вопросы