You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:使用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();
  }
};

关键改进说明

  1. 新增apiReq.end()触发请求发送,确保请求能到达API服务器。
  2. 添加error事件监听,捕获请求过程中的异常并返回友好的错误响应。
  3. 通过data事件拼接响应数据,在end事件中解析为JSON后再返回,保证客户端拿到的是可用的天气数据。
  4. 修正了请求路径中的&为&(&是HTML转义字符,在JS字符串中直接用&即可)。
  5. 用try/catch处理JSON解析可能出现的错误,避免程序崩溃。

内容的提问来源于stack exchange,提问作者Gifron

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 11:10:27