我正在尝试从MAC中的shell脚本运行node js脚本。
#!bin/bash
/usr/local/bin/node /opt/myprojects/instabot/index.js
它工作得很好,但问题是当我尝试读取环境变量时,它们显示为undefined
,我使用dotenv包在node js脚本中使用。env文件传递环境变量(当我直接使用node index.js
运行时,我可以正确读取环境变量)
使用此配置dotenv包require('dotenv').config()
。env文件是KEY=VALUE
格式
如果可能的话,尝试将该bash文件移动到与index.js文件相同的目录中,它将工作。否则,您需要export
环境变量,您可以通过编辑.bashrc文件永久地做到这一点,或者临时使用export foo=bar
需要注入环境变量。手动执行的方法是
USER_ID=239482 USER_KEY=foobar node index.js
但是你已经有了一个。env文件,每次这样做都很痛苦。需要注入.env中的环境变量。下面的bash脚本做到了这一点,确保bash脚本在目录层次结构中与index.js处于同一级别。当你想要启动项目时,只需运行脚本。
#!bin/bash
set -euo pipefail
scriptPath="$( cd "$(dirname "$0")" || true ; pwd -P)"
fail() {
echo "ERROR: $*" > /dev/stderr
exit 1
}
insertDotEnvVars() {
insertEnvFileAndRun "$scriptPath/.env" "$@"
}
insertEnvFileAndRun() {
local envFile="$1"; shift
[[ -f "$envFile" ]] || fail "${envFile} env file not found"
env $(cat $envFile | sed 's/r$//'| xargs) "$@"
}
echo "Starting app"
insertDotEnvVars /usr/local/bin/node "$scriptPath/index.js"
现在,如果您将此脚本保存为run.sh
,那么您可以轻松地通过./run.sh
运行或更新软件包。使用这个bash文件进行启动。然后输入npm run start
您应该以这种方式在utf-8
中编码以工作.env
文件:
const path = require('path');
const dotenv = require('dotenv');
const fs=require('fs');
const configPath = path.join(__dirname, 'config.env');
dotenv.config({ path: configPath });
fs.readFileSync(configPath, 'utf8');