nodejs中的服务器,http请求

时间:2018-06-11 22:52:53

标签: node.js http server

我是节点的新手。我创建了一个简单的服务器我们的想法是,在每个请求中,此服务器向Weather API发出http请求,当它获得答案时,它会将答案发送给客户端。我认为服务器发送的答案太快了。这是我的代码:

    var http = require("http");

    function getWeather()
    {
        var http2 = require("http");

        http2.get("http://api.openweathermap.org/data/2.5/weather?lat=48.914348&lon=2.300282&appid=blabla123456&units=metric", (resp) => {
            let data = '';
            var answer = '-';

            resp.on('data', (chunk) => {
                data += chunk;
            });

            resp.on('end', () => {
                answer += JSON.parse(data).name + ", " + JSON.parse(data).sys.country + "\n" +JSON.parse(data).main.temp + "C";
                return(answer);
            });
        }).on("error", (err) => {
            console.log("Error: " + err.message);
        });
    }

    function hi(){
        return(5);
    }

    http.createServer(function (request, resp) {
        resp.writeHead(200, {'Content-Type': 'text/plain'});
        resp.end("Answer: " + hi() + " " + getWeather());
    }).listen(8080);

    console.log('Server running');

如您所见,函数getWeather返回answer,函数hi返回5。 我的服务器响应是“答案:5未定义”,因此没有显示getAnswer()返回,但hi()返回就在那里。

在控制台中,在我的服务器回答之后打印答案,这正是我希望它显示的内容,但为时已晚。

希望你能帮助我解决这个问题:)

谢谢!

1 个答案:

答案 0 :(得分:1)

因为此事件需要时间来处理,所以无法返回。请尝试使用回调!

function getWeather(callback)
    {
        var http2 = require("http");

        http2.get("http://api.openweathermap.org/data/2.5/weather?lat=48.914348&lon=2.300282&appid=blabla123456&units=metric", (resp) => {
            let data = '';
            var answer = '-';

            resp.on('data', (chunk) => {
                data += chunk;
            });

            resp.on('end', () => {
                answer += JSON.parse(data).name + ", " + JSON.parse(data).sys.country + "\n" +JSON.parse(data).main.temp + "C";
                callback(answer);
            });
        }).on("error", (err) => {
            console.log("Error: " + err.message);
        });
    }

然后是http请求

http.createServer(function (request, resp) {
        resp.writeHead(200, {'Content-Type': 'text/plain'});
        getWeather(function(data) {
            resp.end("Answer: " + hi() + " " + data);
        });
    }).listen(8080);

如果你不能告诉,这可以通过调用数据就绪时发送的函数来实现。