Node.js:http.js:691抛出新错误('不能在发送后设置标题.')

nik*_*oco 3 node.js express angularjs mean-stack

您好我正在使用MEAN堆栈进行简单的应用程序.我得到这个错误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");
Run Code Online (Sandbox Code Playgroud)

还有:app.js Angular路线

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'
            });
    }]);
Run Code Online (Sandbox Code Playgroud)

小智 8

app.get('/api/employees/:employeeId', function() {...});
Run Code Online (Sandbox Code Playgroud)

你正在使用res.json两次.让我们假设Employee.findById首先返回结果.然后,

res.json(employee)
Run Code Online (Sandbox Code Playgroud)

已发送.然后代码稍微延迟进入Employee.find回调.这再次触发res.json().但由于已经发送了对您的请求的响应,因此它无法向同一请求发送另一个响应.

这种情况引发了错误.

有两种方法可以解决这个问题.

  1. 嵌套回调 - 在Employee.findById回调中调用Employee.find.
  2. 在两个回调中添加条件以检查其他回调是否完成.然后发送一个响应.