求助:使用SailsJS调用OpenWeatherMap天气API遇异常
我来帮你排查这段SailsJS调用OpenWeatherMap API的代码问题,几个关键错误导致它没法正常工作:
问题诊断
- 没有触发请求发送:
http.request()只是创建了请求对象,但必须调用.end()方法才会把请求真正发送出去,你的代码漏掉了这一步,请求根本没到达OpenWeatherMap服务器。 - 错误处理缺失:没有监听请求的
error事件,如果出现网络故障、域名解析失败等情况,程序会直接抛出错误甚至崩溃。 - 直接返回响应流对象:
response是一个HTTP响应流对象,不是API返回的实际数据,你直接把它返回给客户端,拿到的会是无法解析的流对象,而非预期的天气数据。 - 异步逻辑处理错误:
http.request是异步操作,你同步赋值rs = response并立刻返回,会导致返回的内容还没拿到API响应就执行了。
修正后的代码
var http = require('http'); module.exports = { getWeather: function(req, res) { var options = { hostname: 'api.openweathermap.org', port: 80, path: '/data/2.5/forecast/daily?id=3188582&units=metric&appid=YOUR_ACTUAL_APP_ID', // 替换成你的真实APP ID,注意把&换成& method: 'GET' }; // 创建请求实例 var apiReq = http.request(options, function(apiRes) { apiRes.setEncoding('utf8'); var responseData = ''; // 逐段收集响应数据 apiRes.on('data', function(chunk) { responseData += chunk; }); // 响应结束后处理数据 apiRes.on('end', function() { try { // 解析JSON格式的响应内容 var weatherData = JSON.parse(responseData); sails.log.debug('Weather API response:', weatherData); res.ok(weatherData); // 返回解析后的天气数据 } catch (err) { sails.log.error('Failed to parse API response:', err); res.serverError('Failed to process weather data'); } }); }); // 监听请求异常 apiReq.on('error', function(err) { sails.log.error('Request to OpenWeatherMap failed:', err); res.serverError('Failed to fetch weather data'); }); // 发送请求 apiReq.end(); } };
关键改进说明
- 新增
apiReq.end()触发请求发送,确保请求能到达API服务器。 - 添加
error事件监听,捕获请求过程中的异常并返回友好的错误响应。 - 通过
data事件拼接响应数据,在end事件中解析为JSON后再返回,保证客户端拿到的是可用的天气数据。 - 修正了请求路径中的
&为&(&是HTML转义字符,在JS字符串中直接用&即可)。 - 用
try/catch处理JSON解析可能出现的错误,避免程序崩溃。
内容的提问来源于stack exchange,提问作者Gifron
相关产品推荐
相关产品推荐

