使用响应Node.js链接GET请求

时间:2016-11-17 22:38:02

标签: node.js

我正在尝试对API执行GET请求,并将API响应中的数据返回给客户端。我认为客户端在对API的GET请求完成之前收到响应。如何更改代码以确保API的响应传递给客户端?

if (request.method == 'POST' && request.url == '/locationdata') {
    var body = '';
    request.on('data', function (data) {
        body += data;
    });

    request.on('end', function () {
        var formattedLocation = body.replace(/[\[\]']+/g, '');
        var urlAPI = 'https://api.darksky.net/forecast/166731d8eab28d33a26c5a51023eff4c/' + formattedLocation;

        response.writeHead(200, { 'Content-Type': 'application/json' });
        var apiData = '';

        var apirequest = function () {
            https.get(urlAPI, function (response) {
                response.on('data', function (data) {
                    apiData += data;
                });
                response.on('end', function () {
                    console.log(apiData);
                    return apiData;
                });
            });
        }

        response.end(apirequest);
    });

    return;
}

1 个答案:

答案 0 :(得分:1)

在从api获取所有数据之前,您正在结束对客户端的响应。将response.end()调用移至api响应的末尾应修复它:

if (request.method == 'POST' && request.url == '/locationdata') {
    var body = '';
    request.on('data', function (data) {
        body += data;
    });

    request.on('end', function () {
        var formattedLocation = body.replace(/[\[\]']+/g, '');
        var urlAPI = 'https://api.darksky.net/forecast/166731d8eab28d33a26c5a51023eff4c/' + formattedLocation;

        response.writeHead(200, { 'Content-Type': 'application/json' });
        var apiData = '';

        https.get(urlAPI, function (apiResponse) {
            apiResponse.on('data', function (data) {
                apiData += data;
            });
            apiResponse.on('end', function () {
                console.log(apiData);
                // send response to browser after we get all the data from the api
                response.end(apiData);
            });
        });

        // remove this because we moved it up
        //response.end(apirequest);
    });

    return;
}