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

Node.js程序如何读取运行目录下的.env.json或env.json文件?

解决Node.js读取运行目录下.env.json文件的问题

看起来你踩了Node.js路径相关的常见坑——混淆了脚本所在目录和命令执行目录,再加上Yeoman工具可能偷偷改了工作目录,导致路径完全不符合预期。我来一步步帮你解决:

1. 先搞懂核心概念的区别

你得先明确这几个路径的真实含义,不然永远会绕晕:

  • __dirname:当前脚本文件所在的目录,比如你的index.js在/rs/deploy/deploy/里,那它就返回这个目录路径,和你在哪执行命令没关系
  • __filename:当前脚本的完整文件路径(包含文件名),绝对不能用来拼接目录,你之前的错误路径就是因为可能把它当成__dirname用了
  • process.cwd():你执行命令时所在的工作目录——正常情况下,你在app1目录跑命令,它就返回app1的路径,但Yeoman这类工具可能会在运行时切换工作目录,导致它返回不对的路径

2. 解决Yeoman环境下的工作目录问题

你说在app1目录运行命令,但process.cwd()返回的是上层projects目录,这大概率是Yeoman搞的鬼。Yeoman会在运行生成器时切换到目标目录,但它会把你初始执行命令的目录存在环境变量INIT_CWD里,直接用这个就对了:

// 获取用户执行yo命令时的初始目录,fallback到process.cwd()以防万一
const targetDir = process.env.INIT_CWD || process.cwd();

3. 正确拼接文件路径并读取

现在拿到了正确的目标目录,接下来就可以拼接你要的.env.json(优先)或env.json路径了,还要先做存在性检查:

const path = require('path');
const fs = require('fs').promises; // 用Promise版fs更简洁

async function loadEnvFile() {
  const targetDir = process.env.INIT_CWD || process.cwd();
  
  // 先尝试隐藏文件
  let envPath = path.join(targetDir, '.env.json');
  try {
    const data = await fs.readFile(envPath, 'utf8');
    console.log('成功读取.env.json:', data);
    return JSON.parse(data);
  } catch (err) {
    // 隐藏文件不存在,尝试非隐藏的
    envPath = path.join(targetDir, 'env.json');
    try {
      const data = await fs.readFile(envPath, 'utf8');
      console.log('成功读取env.json:', data);
      return JSON.parse(data);
    } catch (readErr) {
      console.error('两种环境文件都找不到:', readErr);
      throw readErr;
    }
  }
}

// 调用函数
loadEnvFile();

4. 修复你之前的错误路径

你之前得到的错误路径/Users/i012344/projects/rs/deploy/index.js/.env.json,明显是把__filename(脚本的完整文件路径)当成了目录来拼接。记住:拼接目录+文件名时,一定要用__dirname(脚本所在目录)或者我们上面拿到的targetDir,绝对不能用__filename。

验证方法

你可以先跳过Yeoman,直接在app1目录下运行你的脚本测试:

cd /Users/i012344/projects/app1
node /Users/i012344/projects/rs/deploy/deploy/index.js

这时候打印process.cwd()应该就是app1目录,说明Yeoman确实是干扰项。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 07:12:42