Node JS:发送后无法设置标头

时间:2016-04-25 03:45:58

标签: node.js express

我在网站上查看了各种答案,但我似乎无法找到解决方案。 我从一个页面发出两个几乎相同的请求,其中一个是每15分钟发出一个,另一个是单击完成的。定期调用的是第一个被调用的代码,代码如下:

periodic.js

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事件,然后我得到数据,但然后显示错误 - “无法在发送后设置标题”。

第二页的代码如下:

onclick.js

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;

这两个页​​面仅从一个页面调用。 所以,任何关于我可能出错的建议。

1 个答案:

答案 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); }); }); }; 检查查找查询中是否还有剩余对象。然后使用整个数组调用一次回调。