如何一起使用res.sendFile和res.json

时间:2015-05-11 16:25:01

标签: json angularjs node.js response

当主页加载时,会调用/,同时也会对/courses进行AJAX调用。

来自/courses JSON 响应正在/调用返回的 HTML 中使用。

但是在此实现中出现如下所示的错误 Error:Cannot set headers after they are sent

我想这是因为同时调用/和AJAX调用/courses

如果错误是由我的想法引起的,那么解决方法是什么?

如果需要更多代码,请询问 必要的代码如下所示:

NodeJS代码段

var express        = require('express');
var router         = express.Router();
var db1  = require('../models/courseDetails.js');

/* GET home page. */
router.get('/', function(req, res, next) {
  res.sendFile('index.html');
});

router.get('/courses',function(req,res){
    db1.find({},function(err,data){
    if(err){
        console.log("I am in trouble from NODEJS")
    }else{
        console.log("coming back with the DATA for all courses:");
        console.log(data[0]);
        console.log("Have complete data...................................");
        res.json(data);
    }

    })
    res.json(data)
});

module.exports = router;

FACTORY代码段(正在启动AJAX调用)

.factory('courses',function($http){
return{
    list:function(callback){
        $http({
            method:'GET',
            url:'/courses'  

        })
        .success(callback)
        .error(function(error){
            console.log('I am in error of AJAX,allCourses')
        })

    }
})

1 个答案:

答案 0 :(得分:0)

您收到的错误是在响应完成后代码在响应对象上设置标头时发生的Express错误。在您的情况下,您正在调用res.json()来设置Content-Type标头,并且您在/courses端点中调用了两次。这是在if/else阻止之后发生的,您再次致电res.json()

将您的代码重构为以下内容:

router.get('/courses',function(req,res){
    db1.find({},function(err,data){
        if(err){
            console.log("I am in trouble from NODEJS")
            res.status(500).json({
                message : 'Error getting courses'
            });
        } else {
            console.log("coming back with the DATA for all courses:");
            console.log(data[0]);
            console.log("Have complete data...................................");
            res.status(200).json(data);
        }
    });
});

如果数据库查询带有500状态代码,则会添加一些错误处理,如果数据库查询成功,则会添加200 OK以及所有json数据。