【问题标题】:Nodejs: Can't set headers after they are sentNodejs:发送后无法设置标头
【发布时间】:2016-09-25 20:57:57
【问题描述】:

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

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(final);

我试图消除一些东西以找到根本原因。 当我使用“近”功能删除 where 行时,问题就消失了。 我添加了其他过滤,只是为了测试,一切都很好。只有这个引起了问题。 有什么想法吗?

【问题讨论】:

  • 您可以尝试将错误处理更改为if (err) return res.send(err) 吗?我猜是抛出了一个错误,res.send 被调用,然后,底部的最后一个 res.status 也被调用,导致你的错误。

标签: node.js express mongoose


【解决方案1】:

此错误表示您已经使用了方法res.json()/render()/send(),并且您尝试再次使用。

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

你必须写 return 来停止它。

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

相当于

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

只是不要认为它是返回“res.send(err)”,它正在使用 res.send(err),然后使用 return 停止执行。


删除线也消除错误的原因:

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

【讨论】:

  • 你拯救了我的一天。您的答案是正确的,当我将错误功能更改为您的版本时,我得到了错误,这是找不到地理搜索的索引。确实我忘了添加那个索引。谢谢!
猜你喜欢
  • 2015-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-23
  • 2017-12-22
  • 2018-09-02
  • 2023-04-01
相关资源
最近更新 更多