Nodejs:发送标题后无法设置标题

时间:2016-05-27 13:31:57

标签: node.js express mongoose

这个节点/表达功能给我一个错误: 发送后无法设置标头。 它曾经工作正常,但我已经对用户架构进行了一些更改,将所有地址项移动到“地址”下,如下所示:

firstname,
lastname,
address:{
   street,
   city,
   loc (array of numbers)
   ...
}

所以新功能如下所示:

export function searchMembers(req, res) {
  var lat = req.body.lat;
  var lon = req.body.lon;
  var zoom = req.body.zoom || 14;
 
  var query = User.find();
	var distance = 5000;

	// when this line is removed, problem is gone:
	query = query.where('address.loc').near({center:{type:'Point', coordinates:[lon,lat]}, maxDistance: distance, spherical:true});
	query = query.where({'address.city': 'Toronto'});	
	query = query.sort({'lastname': 1});
     
    query.exec(function(err,users){
         if(err) res.send(err);
 
          var final = [];
          _.forEach(users, function(x){
            var obj = {};
            obj.id = x._id;
            obj.name=x.firstname + ' ' + x.lastname;
            obj.latitude=x.address.loc[1] ;
            obj.longitude=x.address.loc[0] ;

            final.push(obj);
          });
          res.status(200).json(final);
      });
}

所以当我运行这个时,我得到了一个有趣的错误:在发送之后无法设置标题。 指向函数的最后一行: res.status(200)上传.json(最终);

我试图消除东西以找到根本原因。 当我删除带有'near'功能的where行时,问题就消失了。 我添加了其他过滤,只是为了测试,一切都很好。只有这一个导致问题。 有什么想法吗?

1 个答案:

答案 0 :(得分:4)

此错误表示您已使用方法res.json()/render()/send()并尝试再次执行此操作。

在您的情况下,此行不会停止执行if(err) res.send(err);

的方法

你必须写回来停止它。

if(err) {
    res.send(err);
    return;
}

相当于

if(err) {
    return res.send(err);
}

只是不要将其视为返回“res.send(错误)”,它使用res.send(错误),然后使用return停止执行。

删除行的原因还会删除错误:

您在该行中有一些错误(例如列名称错误),因此在回调中发送错误,然后您使用res.send(err),然后调用res.status(200).json(final)