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

被Git忽略的开发密钥导致Express服务器部署失败

解决方案

核心问题

生产环境下编译后的代码仍尝试导入dev.ts,但该文件因被Git忽略未部署到服务器,且生产环境本就不应依赖开发密钥文件。


具体解决方法

1. 重构密钥导入逻辑,避免生产环境加载dev模块

修改keys.ts的代码,仅在对应环境下导入对应密钥文件,不要在全局范围同时导入两个模块(否则TypeScript编译后仍会生成加载dev.ts的代码)。

示例代码:

// keys.ts
let keys;

if (process.env.NODE_ENV === 'production') {
  // 生产环境仅加载prod.ts
  keys = require('./prod');
} else {
  // 开发环境才加载dev.ts
  keys = require('./dev');
}

export default keys;

或者使用ES模块动态导入(需处理异步):

// keys.ts
let keys;

(async () => {
  if (process.env.NODE_ENV === 'production') {
    keys = await import('./prod');
  } else {
    keys = await import('./dev');
  }
})();

export default keys;

2. 提交占位版dev.ts到Git(不泄露真实密钥)

如果不想改代码,可以在仓库中添加一个不含真实密钥的dev.ts占位文件,将真实开发密钥放在另一个被Git忽略的文件(比如dev.local.ts)中。

  • 仓库中的dev.ts内容(提交到Git):
// dev.ts - 占位文件,真实密钥请在本地创建dev.local.ts
export default {
  apiKey: '',
  dbUrl: ''
};
  • 本地创建dev.local.ts(添加到.gitignore):
// dev.local.ts - 本地开发用真实密钥
export default {
  apiKey: 'your-dev-api-key',
  dbUrl: 'your-dev-db-url'
};
  • 修改keys.ts优先加载本地密钥文件:
// keys.ts
let keys;

if (process.env.NODE_ENV === 'production') {
  keys = require('./prod');
} else {
  try {
    // 优先加载本地真实密钥
    keys = require('./dev.local');
  } catch (err) {
    // 本地没有dev.local.ts时用占位的dev.ts
    keys = require('./dev');
  }
}

export default keys;

3. 确保生产环境NODE_ENV正确设置

部署服务器时,必须将NODE_ENV设置为production,否则代码会走开发分支尝试加载dev.ts。

启动命令示例:

# Linux/macOS
NODE_ENV=production node dist/server.js

# Windows(命令提示符)
set NODE_ENV=production && node dist/server.js

# Windows(PowerShell)
$env:NODE_ENV="production"; node dist/server.js

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 13:30:08