这是nodejs中用于调用openweather API并在127.0.0.7:8124上打印结果的代码,但不明白为什么它不起作用
var http = require('http');
function getData(city, res){
var urlData = 'http://api.openweathermap.org/data/2.5/weather?q='+city;
http.get(urlData, function(resi) {
var body = '';
resi.on('data', function(chunk) {
body += chunk;
});
resi.on('end', function() {
var dataResponse = JSON.parse(body)
res.write(dataResponse);
});
}).on('error', function(e) {
res.write("Got error: " + e);
});
}
// create http server
http.createServer(function (req, res) {
var query = require('url').parse(req.url).query;
var app = require('querystring').parse(query).city;
// content header
res.writeHead(200, {'Content-Type': 'text/plain'});
if(app){
console.log("ad: "+getData(app));
} else res.write("Use url:port?city=xxxx");
res.end();
}).listen(8124);
console.log('Server running at 8124');
这是错误
overflow@overflow-1015cx:~/Scrivania/nodeweather$ node app.js
Server running at 8124
ad: undefined
/home/overflow/Scrivania/nodeweather/app.js:15
res.write(dataResponse);
^
TypeError: Cannot call method 'write' of undefined
at IncomingMessage.<anonymous> (/home/overflow/Scrivania/nodeweather/app.js:15:13)
at IncomingMessage.EventEmitter.emit (events.js:117:20)
at _stream_readable.js:920:16
at process._tickCallback (node.js:415:13)
overflow@overflow-1015cx:~/Scrivania/nodeweather$
为什么我不能退回结果?
答案 0 :(得分:4)
您没有将响应对象传递给getData
我相信它应该是这样的,但我还没有测试过它。
if(app){
console.log("ad: "+getData(app,res));
} else res.write("Use url:port?city=xxxx");\
如果你读错了,它没有告诉你你不能写,那就是说你试图在空对象上调用write。如果你追踪res
如何为空的线索,它应该变得清晰。
答案 1 :(得分:1)
Nodejs是异步的,在http请求中的res.write之前调用res.end()所以你需要使用一些&#34; promise&#34; tecnique或至少回调。但是,由于您尝试编写已解析的json字符串,此代码无法正常工作,但write方法只接受字符串或缓冲区...而且getData不会返回任何内容..so console.log(&#34) ; ad:&#34; + getData(app,res,res.end));打印一个未定义的变量。
也许这段代码更符合您的想法(使用&#34; rome&#34;进行测试和工作):
var http = require('http');
function getData(city, res,callback){
var urlData = 'http://api.openweathermap.org/data/2.5/weather?q='+city;
http.get(urlData, function(resi) {
var body = '';
resi.on('data', function(chunk) {
body += chunk;
});
resi.on('end', function() {
body=JSON.stringify(JSON.parse(body), null, 4)
res.write(body);
callback(body);
});
}).on('error', function(e) {
res.write("Got error: " + e);
callback("error");
});
}
// create http server
http.createServer(function (req, res) {
var query = require('url').parse(req.url).query;
var app = require('querystring').parse(query).city;
// content header
res.writeHead(200, {'Content-Type': 'text/plain'});
if(app){
getData(app,res,function (message) {
console.log("ad:",message);
res.end();
});
} else {
res.write("Use url:port?city=xxxx");
res.end("done");
}
}).listen(8124);
console.log('Server running at 8124');