我在网站上查看了各种答案,但我似乎无法找到解决方案。 我从一个页面发出两个几乎相同的请求,其中一个是每15分钟发出一个,另一个是单击完成的。定期调用的是第一个被调用的代码,代码如下:
var express = require('express');
var router = express.Router();
var mongodb = require('mongodb');
var assert = require('assert');
router.get('/', function(req, res, next) {
var MongoClient = mongodb.MongoClient;
var url = 'mongodb://localhost:27017/test';
MongoClient.connect(url, function (err, db) {
if (err) {
console.log('Unable to connect to the mongoDB server. Error:', err);
} else {
get_number(db,function(user_res){
return res.json(user_res);
db.close();
})
}
});
});
function get_number(db,cb)
{
var collection = db.collection('result');
collection.aggregate(
{ $group:
{ _id: {'number':'$number','name':'$name'}, total: { $sum: 1 } }
},
{ $sort : { total : -1 } },
{ $limit : 10 },
function (err, res) {
if (err) console.log(err);
cb(res);
}
);
}
module.exports = router;
问题是每次我调用第二页,onclick事件,然后我得到数据,但然后显示错误 - “无法在发送后设置标题”。
第二页的代码如下:
var express = require('express');
var router = express.Router();
var mongodb = require('mongodb');
var assert = require('assert');
router.get('/:number', function(req,res,next){
var MongoClient = mongodb.MongoClient;
id = parseInt(req.params.number);
var url = 'mongodb://localhost:27017/test';
MongoClient.connect(url, function (err, db) {
if (err) {
console.log('Unable to connect to the mongoDB server. Error:', err);
} else {
get_comments(db,function(user_res){
res.json(user_res);
db.close();
})
}
});
});
var get_comments = function(db, callback) {
var cursor = db.collection('result').find({ 'number': id });
cursor.each(function(err, doc) {
assert.equal(err, null);
callback(doc);
if (doc != null) {
callback(doc);
} else {
callback();
}
});
};
module.exports = router;
这两个页面仅从一个页面调用。 所以,任何关于我可能出错的建议。
答案 0 :(得分:2)
问题在于他cursor.each
部分。您正在呼叫每个项目的回调,然后在连接中发送所有项目的个人响应。但是对于请求,res.json只能使用一次。您必须重新构建您的代码,以便立即发送所有数据 或使用res.write
发送回复,并在通过调用{{1}发送所有数据后手动结束响应}
尝试将res.end()
更改为以下内容。您将不得不编辑使用此数据的客户端,因为它将接收一组对象。
get_comments
在这种情况下,从查询返回的文档将逐个迭代并推送到临时数组。然后 var get_comments = function(db, callback) {
var cursor = db.collection('GameScore').find({ 'number': id });
var docArr = [];
cursor.each(function(err, doc) {
assert.equal(err, null);
if (doc != null) {
docArr.push(doc);
}
cursor.hasNext().then(function(){
callback(docArr);
});
});
};
检查查找查询中是否还有剩余对象。然后使用整个数组调用一次回调。