Node.js:http.js:691抛出新错误(“发送头后无法设置头.") [英] Node.js: http.js:691 throw new Error('Can\'t set headers after they are sent.')

查看:55
本文介绍了Node.js:http.js:691抛出新错误(“发送头后无法设置头.")的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

您好,我正在使用MEAN堆栈进行简单的应用程序.我得到这个错误http.js:691抛出新错误(发送后无法设置标头.")

Hello I am making simple application using MEAN stack. And I get this error http.js:691 throw new Error('Can\'t set headers after they are sent.')

这是代码: server.js

Here is the code: 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角路线

And also: app.js Angular routes

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'
            });
    }]);

推荐答案

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

您两次使用res.json.假设Employee.findById首先返回结果.然后,

you are using res.json twice. Lets assume Employee.findById returns the results first. Then,

res.json(employee)

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

is already sent. Then the code enters Employee.find callback with a slight delay. This again triggers res.json(). But since the response to your request is already sent, it can't send another response to the same request.

此情况引发了错误.

有两种解决方法.

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

这篇关于Node.js:http.js:691抛出新错误(“发送头后无法设置头.")的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆