这个节点/表达功能给我一个错误: 发送后无法设置标头。 它曾经工作正常,但我已经对用户架构进行了一些更改,将所有地址项移动到“地址”下,如下所示:
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行时,问题就消失了。 我添加了其他过滤,只是为了测试,一切都很好。只有这一个导致问题。 有什么想法吗?
答案 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)