非调试模式下运行Node.js出现JSON解析错误如何解决
错误根因
SyntaxError: Unexpected token u in JSON at position 0报错的本质是传入JSON.parse()的参数为undefined:JS会先将undefined转为字符串"undefined"再尝试解析,第一个字符u不属于合法JSON起始字符,因此抛出语法错误。
两种运行场景表现不一致的核心原因:
- VS Code调试模式下,启动配置(
.vscode/launch.json)通常会自动配置工作目录、指定envFile路径,甚至直接在配置中硬编码注入环境变量,因此process.env.CALENDAR_CREDENTIALS可以正常读取到字符串值。 - 终端直接执行
node命令时,dotenv默认从执行命令时的终端工作目录查找.env文件,不会从JS脚本所在目录查找。如果终端当前路径和VS Code调试时的工作目录不一致、或者没有显式指定.env路径,dotenv就会加载失败,对应环境变量返回undefined,和你添加的类型检测结果完全匹配。
修复步骤
- 显式指定dotenv加载的.env文件路径,彻底规避工作目录不一致导致的加载失败,修改代码如下:
const { google } = require('googleapis'); const path = require('path'); // 请根据实际.env文件位置调整路径:如果.env和当前JS脚本同目录,就把'../.env'改成'.env' require('dotenv').config({ path: path.resolve(__dirname, '../.env') }); // 增加环境变量合法性校验,提前抛出明确错误,避免无意义的JSON解析报错 if (!process.env.CALENDAR_CREDENTIALS) { throw new Error('CALENDAR_CREDENTIALS 环境变量缺失,请检查.env配置'); } if (!process.env.CALENDAR_ID) { throw new Error('CALENDAR_ID 环境变量缺失,请检查.env配置'); } const CREDENTIALS = JSON.parse(process.env.CALENDAR_CREDENTIALS); const CALENDAR_ID = process.env.CALENDAR_ID;
- 排查.env文件本身的配置问题:
- 确认
.env文件中确实存在CALENDAR_CREDENTIALS和CALENDAR_ID配置项,不要只在VS Code的launch.json里写环境变量 - 如果
CALENDAR_CREDENTIALS是多行JSON,需要先压缩为单行字符串再存入.env,避免dotenv解析换行失败
- 确认
- 临时验证方案:终端执行node命令前,先执行
ls .env(macOS/Linux)或dir .env(Windows),确认当前工作目录下存在.env文件后再运行脚本。
内容的提问来源于stack exchange,提问作者ENV
相关产品推荐
相关产品推荐

