如何在app.js中识别启动脚本是npm run dev还是npm start?
如何让app.js识别当前启动脚本是dev还是start
核心思路是通过环境变量区分启动模式,下面是具体实现方法:
1. 修改package.json脚本,添加环境变量
直接在脚本里给dev和start模式分别设置标识变量:
"scripts": { "dev": "APP_ENV=dev nodemon app.js", "start": "APP_ENV=prod node app.js" }
如果需要兼容Windows系统,先安装跨平台环境变量工具cross-env:
npm install cross-env --save-dev
再把脚本改成跨平台兼容版:
"scripts": { "dev": "cross-env APP_ENV=dev nodemon app.js", "start": "cross-env APP_ENV=prod node app.js" }
你也可以用Node.js通用的NODE_ENV变量替代自定义的APP_ENV,脚本改成:
"scripts": { "dev": "cross-env NODE_ENV=development nodemon app.js", "start": "cross-env NODE_ENV=production node app.js" }
2. 在app.js里读取环境变量并处理
通过process.env读取设置的变量,就能判断当前启动模式,同时解决cron的终止问题:
// 读取环境变量,优先用自定义的APP_ENV,没有则用NODE_ENV const currentMode = process.env.APP_ENV || process.env.NODE_ENV; if (currentMode === 'dev' || currentMode === 'development') { console.log('当前是开发模式,由npm run dev启动'); // 针对cron问题,监听nodemon的终止信号(SIGUSR2),优雅收尾 process.on('SIGUSR2', () => { console.log('nodemon即将终止,开始处理cron任务收尾...'); // 调用你的cron任务停止方法,比如:yourCronJob.stop(); // 给任务留足够时间处理完,再退出进程 setTimeout(() => process.exit(0), 1500); }); } else { console.log('当前是生产模式,由npm start启动'); }
内容的提问来源于stack exchange,提问作者Bennyh961
相关产品推荐
相关产品推荐

