Javascript 如何使用ts节点加载环境变量?

Javascript 如何使用ts节点加载环境变量?,javascript,node.js,typescript,environment-variables,dotenv,Javascript,Node.js,Typescript,Environment Variables,Dotenv,我尝试了一些实现,但没有一个成功 第一次尝试 在package.json脚本中使用eval“fetch:data”:“eval$(cat.env)ts节点-O'{\'module\':\'commonjs\'}./bin/build api data.ts” 这会导致JSON解析错误,因为eval出于某种原因删除了我的引号 undefined:1 {module:commonjs} ^ SyntaxError: Unexpected token m in JSON at position 1

我尝试了一些实现,但没有一个成功

第一次尝试 在package.json脚本中使用
eval
“fetch:data”:“eval$(cat.env)ts节点-O'{\'module\':\'commonjs\'}./bin/build api data.ts”

这会导致JSON解析错误,因为eval出于某种原因删除了我的引号

undefined:1
{module:commonjs}
 ^

SyntaxError: Unexpected token m in JSON at position 1
第二次尝试 使用dotenv时,我在这里遇到的问题是,这是一个竞争条件,导致了如下错误:

$ CANDID_ENV=local ts-node -O '{"module":"commonjs"}' ./bin/build-api-data.ts

/Users/lassiter.gregg/code/candidco-web/node_modules/contentful/dist/webpack:/contentful/contentful.js:49
    throw new TypeError('Expected parameter accessToken')
          ^
TypeError: Expected parameter accessToken
代码示例

从“fs”导入fs;
从“路径”导入路径;
从“../lib/apiData”导入fetchApiData;
从“dotEnv safe”导入dotEnv;
const{CANDID_ENV}=process.ENV;
const isLocalBuild=CANDID_ENV=='local';
console.log(dotEnv);
const API_DATA_FILENAME='API_DATA.json';
const ensureRedirectoryExistence=文件路径=>{
var dirname=path.dirname(filePath);
if(fs.existsSync(dirname)){
返回true;
}
确保存在(dirname);
fs.mkdirSync(dirname);
};
常量writeData=(文件名、数据)=>{
const filePath=path.join(uu dirname,“…”,“.data”,filename);
确保重定向存在(文件路径);
writeFileSync(filePath,JSON.stringify(data));
log('API数据存储',文件路径);
};
const fetchAndStoreApiData=async()=>{
log(“获取所有API数据”);
等待dotEnv.config({
路径:isLocalBuild?'./.env':`./.env.${CANDID_env}`,
});
const newData=await fetchApiData();
writeData(API_数据_文件名,newData);
};
const init=async()=>{
fetchAndStoreApiData();
};
if(require.main==模块){
init();
}
在上面的例子中,我尝试在文件顶部、init中、函数中执行
dotenv.config
,如您所见。它总是抛出相同的错误,即contentful没有获得它需要的env变量。也就是说,如果我登录
process.env
并注释掉与
fetchApiData
相关的代码,那么我就会看到所有的环境变量。这就是为什么我认为这是一个比赛时间条件,但还没有找到任何类似于我自己的问题


此外,更棘手的是,这是一个自定义脚本,必须在节点和esnext环境中工作。因此,我曾经遇到过很多棘手的导入/导出问题,使用的语法我并不喜欢,但还没有找到(例如,
export=someFunction
)。

我是否正确地看到,您试图用一个变量配置dotenv,并用一个env变量初始化该变量?我认为那是行不通的。 Dotenv的工作是将env变量加载到process.env。您必须尽早在应用程序中配置它

更多信息请点击此处: