NodeJS调用OpenWeatherMap API遇401错误求助
问题分析与修正方案
问题核心原因
你遇到的401未授权错误,主要由以下几点导致:
- 鉴权方式错误:OpenWeatherMap API不支持
Bearer Token请求头鉴权,仅接受通过appidURL参数传递密钥的方式。 - 环境变量读取异常:你的
.env文件中API_KEY = XX_API_KEY_XX的写法包含空格,会导致读取到的密钥自带多余空格,直接引发鉴权失败。 - 额外无效参数:
/weather接口不需要limit=5参数(该参数属于/find接口),虽不直接触发错误,但属于冗余配置。
修正步骤
1. 修复.env文件格式
将密钥定义改为无空格的标准格式,避免读取时携带多余字符:
API_KEY=XX_API_KEY_XX
2. 修正weather.js请求逻辑
删除错误的Bearer请求头,改用官方要求的appid参数传递密钥,同时移除无效参数并恢复动态获取城市名的逻辑:
const express = require("express"); const axios = require("axios"); const router = express.Router(); require("dotenv").config(); const apiKey = process.env.API_KEY; router.get("/weather", async (req, res) => { // 从请求参数获取城市名,默认值设为cochin const city = req.query.city || `cochin`; try { // 构造符合官方要求的请求URL const url = `https://api.openweathermap.org/data/2.5/weather?q=${city}&appid=${apiKey}`; const response = await axios.get(url); const weatherData = response.data; res.json(weatherData); } catch (error) { console.error("获取天气数据失败", error); // 返回更精准的错误信息 res.status(error.response?.status || 500).json({ error: `获取天气数据失败: ${error.response?.data?.message || error.message}` }); } }); module.exports = router;
3. 额外验证事项
如果修正后仍报错,请确认:
- API密钥已在OpenWeatherMap官网正确生成并激活(新密钥可能需要10-15分钟生效)
- 密钥未超出免费调用额度
- 请求的城市名称拼写正确(支持英文或拼音,大小写不敏感)
测试请求示例
启动服务后,可通过以下URL测试接口:
http://localhost:3000/api/weather?city=cochin
调用成功后即可得到你期望格式的天气JSON数据。
内容的提问来源于stack exchange,提问作者Achu Anil
相关产品推荐
相关产品推荐

