在 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
});