【发布时间】: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 解析 ;)