![](/img/trans.png)
[英]node.js app: throw new Error('Can\'t set headers after they are sent.')
[英]Node.js Error: Can't set headers after they are sent.
我正在编写一个简单的查询以获取mongodb中所有课程列表。 我得到一个{}作为响应,node.js停止并显示错误,“错误:发送标头后无法设置标头”。
这是我的课程收集模式。 course.js
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var course = new Schema({
course : [{courseName : String}]
}, {collection : 'course'});
module.exports = mongoose.model('course', course);
这是用于查询的index.js文件中的router.get。
router.get('/course', function (req, res) {
collection = db.collection('course');
query = {};
projection = {"_id" : 0, "course.courseName": 1};
cursor = collection.find(query);
cursor.project(projection);
cursor.forEach(function (doc) {
res.send(doc);
},
function (err) {
if(err)
throw err;
}
);
});
这是我得到的错误。
GET /course 200 34.808 ms - 2
/home/vikas/study/angularjs/learnAngularjsCoursera/passportAuthentication/node_modules/mongodb/node_modules/mongodb-core/lib/cursor.js:175
throw err;
^
Error: Can't set headers after they are sent.
at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:356:11)
at ServerResponse.header (/home/vikas/study/angularjs/learnAngularjsCoursera/passportAuthentication/node_modules/express/lib/response.js:718:10)
at ServerResponse.send (/home/vikas/study/angularjs/learnAngularjsCoursera/passportAuthentication/node_modules/express/lib/response.js:163:12)
at ServerResponse.json (/home/vikas/study/angularjs/learnAngularjsCoursera/passportAuthentication/node_modules/express/lib/response.js:249:15)
at ServerResponse.send (/home/vikas/study/angularjs/learnAngularjsCoursera/passportAuthentication/node_modules/express/lib/response.js:151:21)
at /home/vikas/study/angularjs/learnAngularjsCoursera/passportAuthentication/routes/index.js:234:19
at /home/vikas/study/angularjs/learnAngularjsCoursera/passportAuthentication/node_modules/mongodb/lib/cursor.js:773:23
at handleCallback (/home/vikas/study/angularjs/learnAngularjsCoursera/passportAuthentication/node_modules/mongodb/node_modules/mongodb-core/lib/cursor.js:172:5)
at nextFunction (/home/vikas/study/angularjs/learnAngularjsCoursera/passportAuthentication/node_modules/mongodb/node_modules/mongodb-core/lib/cursor.js:682:5)
at Cursor.next [as _next] (/home/vikas/study/angularjs/learnAngularjsCoursera/passportAuthentication/node_modules/mongodb/node_modules/mongodb-core/lib/cursor.js:692:3)
at loop (/home/vikas/study/angularjs/learnAngularjsCoursera/passportAuthentication/node_modules/mongodb/lib/cursor.js:687:8)
at _each (/home/vikas/study/angularjs/learnAngularjsCoursera/passportAuthentication/node_modules/mongodb/lib/cursor.js:734:16)
at /home/vikas/study/angularjs/learnAngularjsCoursera/passportAuthentication/node_modules/mongodb/lib/cursor.js:745:7
at handleCallback (/home/vikas/study/angularjs/learnAngularjsCoursera/passportAuthentication/node_modules/mongodb/lib/utils.js:96:12)
at /home/vikas/study/angularjs/learnAngularjsCoursera/passportAuthentication/node_modules/mongodb/lib/cursor.js:675:5
at handleCallback (/home/vikas/study/angularjs/learnAngularjsCoursera/passportAuthentication/node_modules/mongodb/node_modules/mongodb-core/lib/cursor.js:172:5)
请向我建议我要去哪里错了。
使用express,您只能在每个路由上拨打一次res.send
。 就您而言,您似乎正在尝试将文档列表返回给客户端,对吗?
您需要做的是先创建一个对象数组,然后返回它。
您可以通过以下方法修改现有路线以使其正常运行:
router.get('/course', function(req, res) {
var collection = db.collection('course');
var query = {};
var projection = {"_id" : 0, "course.courseName": 1};
var docs = [];
cursor = collection.find(query);
cursor.project(projection);
cursor.forEach(function(doc) {
docs.push(doc);
}, function (err) {
if (err) throw err;
res.json({docs: docs});
});
});
可以尝试使用回调函数,并return res.send
所有数据的return res.send
。
喜欢:
router.get('/course', function (req, res) {
var collection = db.collection('course');
var query = {};
var projection = {"_id" : 0, "course.courseName": 1};
collection.find(query, projection).toArray(function (err, docs) {
if(err) {
return res.status(500).send({error:err.message});
}
return res.status(200).send(docs);
});
});
您可以根据问题描述使用猫鼬。 所以您应该使用它而不是collection = db.collection('course');
。 首先加载该course
模型,然后使用它
var Course = require("course");// your course.js file path. can be like: "../model/course"
Course.find(query, projection, function (err, docs){
//... like above function
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.