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

node fetch报unable to verify the first certificate错误求助

解决Node.js请求API时的SSL证书验证错误

问题描述

尝试从https://www.meteoromania.ro/wp-json/meteoapi/v2/starea-vremii获取数据,初始功能正常,一段时间后出现错误:

Error getting RoMeteo data: FetchError: request to https://www.meteoromania.ro/wp-json/meteoapi/v2/starea-vremii failed, reason: unable to verify the first certificate

所用请求代码:

const fetch = require("node-fetch");

exports.getAirQualityData = functions.pubsub.schedule("every 5 minutes").onRun(async (context) => {
  const urlRoMeteo = "https://www.meteoromania.ro/wp-json/meteoapi/v2/starea-vremii";
  const settings = { method: "GET" };
    try {
      const resRoMeteo = await fetch(urlRoMeteo);
      const jsonRoMeteo = await await resRoMeteo.json();
      const dataRoMeteo = jsonRoMeteo["features"][2]["properties"];
      const tp = dataAirVisual["tp"];
      const wind = dataRoMeteo["vant"];
      const pression = dataRoMeteo["presiunetext"];
      const dataJson = {
        "air": [{
          "airTS": airTs,
          "pm25": pm25,
          "co2": co2,
          "hm": hm,
          "tp": tp,
          "wind": wind,
          "pression": pression,
        },
        ],
      };
      try {
        await admin.firestore().collection("collection").doc("Air").update(dataJson);
        return console.log("Document 2 updated!");
      } catch (error) {
        return console.log("Error writing document 2: " + error);
      }
    } catch (error1) {
      return console.log("Error getting RoMeteo data: " + error1);
    }
}

修复方案

1. 临时绕过SSL验证(仅测试用,生产环境禁用)

在fetch配置中关闭证书验证,快速恢复功能,但会带来安全风险:

const https = require('https');
const settings = { 
  method: "GET",
  agent: new https.Agent({ rejectUnauthorized: false })
};

2. 更新根证书库

错误多因本地根证书过期或服务器证书链不完整,通过第三方包导入最新根证书:

  • 安装依赖:
    npm install ssl-root-cas --save
    
  • 在代码开头添加:
    require('ssl-root-cas/latest')
      .inject()
      .addFile(__dirname + '/node_modules/ssl-root-cas/cacert.pem');
    

3. 手动指定目标服务器证书

下载目标网站的SSL证书文件(如meteoromania.crt),在请求中指定证书:

const https = require('https');
const fs = require('fs');

const settings = {
  method: "GET",
  agent: new https.Agent({
    ca: fs.readFileSync('./meteoromania.crt')
  })
};

4. 升级Node.js版本

旧版本Node.js可能不支持新的证书算法或根证书,升级到最新LTS版本可解决多数SSL验证问题。

额外代码修正

代码中存在冗余await:const jsonRoMeteo = await await resRoMeteo.json();,应改为const jsonRoMeteo = await resRoMeteo.json();,避免潜在逻辑问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 20:03:20