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
相关产品推荐
相关产品推荐

