Я новичок в node. Я создал простой сервер. Идея состоит в том, что при каждом запросе эти серверы отправляют HTTP-запрос к API погоды, и когда он получает ответ, он отправляет ответ клиенту. Я думаю, что сервер отправляет ответ слишком быстро. Это мой код:

    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. Мой ответ сервера - «Ответ: 5 undefined», поэтому возврат getAnswer () не представлен, но есть возврат hi ().

В консоли ответ печатается после ответа моего сервера, и это именно то, что я хочу, чтобы он отображал, но слишком поздно.

Надеюсь, вы поможете мне решить эту проблему :)

Благодарность!

0
Eskombro 12 Июн 2018 в 01:52

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

Если вы не можете сказать, это работает путем вызова функции, которая отправляется, когда данные готовы.

1
person 11 Июн 2018 в 23:01