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

