2014-01-30 41 views
3

你好我正在使用MEAN棧進行簡單的應用程序。而我得到這個錯誤http.js:691拋出新的錯誤(「可以\」噸設置頭髮送之後「。)Node.js:http.js:691拋出新的錯誤('在發送後不能設置標題'。)

下面是代碼: 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.findById回調中調用Employee.find。
  2. 在兩個回調中添加條件以檢查其他回調是否完成。然後發送一個單一的回覆。
+0

非常感謝,它幫助了我很多:) – nikolakoco

相關問題