【问题标题】:Server in nodejs, http requestnodejs中的服务器,http请求
【发布时间】:2018-06-11 22:52:52
【问题描述】:

我是节点新手。我创建了一个简单的服务器。这个想法是,在每次请求时,这个服务器都会向 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 undefined”,所以 getAnswer() 返回没有出现,但是 hi() 返回在那里。

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

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

谢谢!

【问题讨论】:

  • 与您的错误无关,但您应该只JSON.parse 一次。 const result = JSON.parse(data); 然后使用:result.name,result.sys.country....你的实际错误是getWeather是异步的,你应该等到请求完成后再调用:resp.end。检查副本。
  • 感谢您的建议,我会优化我的 JSON 解析 ;)

标签: node.js http server


【解决方案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);

如果你看不出来,这可以通过调用一个在数据准备好时发送的函数来实现。

【讨论】:

  • 工作,完美,谢谢!所以这个想法是服务器收到一个请求,它调用我的 getWeather 函数,并作为参数传递一个函数,当一切完成后,我的数据将使用我的数据生成 resp.end()。很好,谢谢!
  • 这是一种相对简单的方法。如果你想变得更好,我建议尝试使用 Promise,甚至更高级 - 使用 async/await
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-02
  • 2018-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多