簡體   English   中英

Node.js中的服務器,http請求

[英]Server in nodejs, http request

我是Node的新手。 我創建了一個簡單的服務器。 想法是,在每次請求時,此服務器都會向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返回答案,函數hi返回5。我的服務器響應為“ Answer:5未定義”,因此未顯示getAnswer()返回,但是存在hi()返回。

在控制台中,答案打印在服務器的答案之后,這正是我想要顯示的內容,但為時已晚。

希望你能幫助我解決這個問題:)

謝謝!

由於此事件需要花費時間來處理,因此您無法將其返回。 嘗試改用回調!

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

如果您無法分辨,則可以通過調用在數據准備好后發送的函數來實現。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM