在 get 请求中发送后无法设置 headers
Can't set headers after they are sent in get request
router.get('/getpostcode', function(req, res){
console.log(req.query.suburb);
var options = {
url: 'http://apiurl?suburb=' + req.query.suburb + "&state=" + req.query.state ,
headers: {
'auth-key': key
}
}
request(options, callback);
function callback(error, response, body){
if(!error && response.statusCode == 200){
info = JSON.parse(body);
info = info.localities.locality;
if( Object.prototype.toString.call( info ) == '[object Array]' ){
for ( var x = 0 ; x < info.length ; x++ ){
var locx = info[x].location;
var qsuburb = req.query.suburb;
if( locx == qsuburb.toUpperCase() ){
res.send( { 'postcode': info[x].postcode } );
}
}
} else if (Object.prototype.toString.call( info ) != '[object Array]') {
var locx = info.location;
var qsuburb = req.query.suburb;
if ( locx == qsuburb.toUpperCase() ){
res.send( { 'postcode': info.postcode } );
}
}
}
}
});
所以,我正在尝试从 API 请求数据,然后根据该数据,我会发回一些数据。我的代码如上。
不幸的是,在回调函数中,当我 运行 循环查找我将发送回客户端的特定元素时,当将该元素发送给客户端时,我得到的错误是如标题所示。
没有循环时不会发生这种情况,我只是将数据的一个元素发回。
有什么想法吗?
您在流程中至少两次到达 res.send
函数调用,这是不允许的。必须调用一次该函数才能将响应发送到客户端。
您正在为一个请求发送多个响应,请在循环外写入 res.send 或 JSON。
for (var x = 0; x < info.length; x++) {
var locx = info[x].location;
var qsuburb = req.query.suburb;
var postcodes = [];
if (locx == qsuburb.toUpperCase()) {
postcodes.push({
'postcode': info[x].postcode
});
}
res.json(postcodes);
}
是的,正如 @Rahul 所说,不允许对同一请求发送多次响应 - 您必须获得相同的 post 代码,因此您要么需要存储您的post在变量中编码并在循环结束后发送它,或者您可以使用 break
。虽然不建议在非常简单的循环中使用复杂循环中的中断,但您可以利用它的用法。
for (var x = 0; x < info.length; x++) {
var locx = info[x].location;
var qsuburb = req.query.suburb;
if (locx == qsuburb.toUpperCase()) {
res.send({
'postcode': info[x].postcode
});
break;
}
}
或如下:
for (var x = 0; x < info.length; x++) {
var locx = info[x].location;
var qsuburb = req.query.suburb;
vat postcode = = null;
if (locx == qsuburb.toUpperCase()) {
postcode = info[x].postcode
}
}
res.send({
postcode
});
router.get('/getpostcode', function(req, res){
console.log(req.query.suburb);
var options = {
url: 'http://apiurl?suburb=' + req.query.suburb + "&state=" + req.query.state ,
headers: {
'auth-key': key
}
}
request(options, callback);
function callback(error, response, body){
if(!error && response.statusCode == 200){
info = JSON.parse(body);
info = info.localities.locality;
if( Object.prototype.toString.call( info ) == '[object Array]' ){
for ( var x = 0 ; x < info.length ; x++ ){
var locx = info[x].location;
var qsuburb = req.query.suburb;
if( locx == qsuburb.toUpperCase() ){
res.send( { 'postcode': info[x].postcode } );
}
}
} else if (Object.prototype.toString.call( info ) != '[object Array]') {
var locx = info.location;
var qsuburb = req.query.suburb;
if ( locx == qsuburb.toUpperCase() ){
res.send( { 'postcode': info.postcode } );
}
}
}
}
});
所以,我正在尝试从 API 请求数据,然后根据该数据,我会发回一些数据。我的代码如上。
不幸的是,在回调函数中,当我 运行 循环查找我将发送回客户端的特定元素时,当将该元素发送给客户端时,我得到的错误是如标题所示。
没有循环时不会发生这种情况,我只是将数据的一个元素发回。
有什么想法吗?
您在流程中至少两次到达 res.send
函数调用,这是不允许的。必须调用一次该函数才能将响应发送到客户端。
您正在为一个请求发送多个响应,请在循环外写入 res.send 或 JSON。
for (var x = 0; x < info.length; x++) {
var locx = info[x].location;
var qsuburb = req.query.suburb;
var postcodes = [];
if (locx == qsuburb.toUpperCase()) {
postcodes.push({
'postcode': info[x].postcode
});
}
res.json(postcodes);
}
是的,正如 @Rahul 所说,不允许对同一请求发送多次响应 - 您必须获得相同的 post 代码,因此您要么需要存储您的post在变量中编码并在循环结束后发送它,或者您可以使用 break
。虽然不建议在非常简单的循环中使用复杂循环中的中断,但您可以利用它的用法。
for (var x = 0; x < info.length; x++) {
var locx = info[x].location;
var qsuburb = req.query.suburb;
if (locx == qsuburb.toUpperCase()) {
res.send({
'postcode': info[x].postcode
});
break;
}
}
或如下:
for (var x = 0; x < info.length; x++) {
var locx = info[x].location;
var qsuburb = req.query.suburb;
vat postcode = = null;
if (locx == qsuburb.toUpperCase()) {
postcode = info[x].postcode
}
}
res.send({
postcode
});