dotenv
NPMパッケージを使用しようとしていますが、うまくいきません。次の内容のファイルconfig/config.js
があります。
'use strict';
var dotenv = require('dotenv');
dotenv.load();
console.log('config');
アプリケーションフォルダーのルートに別のファイル.env
があります。環境変数TWILIO_ACCOUNT_SID
もあります。
これは、特定の関数で環境変数を使用しようとしているときに行うプロセスです。
$ node
> require('./config/config.js');
config
{}
> process.env.TWILIO_ACCOUNT_SID
undefined
TWILIO_ACCOUNT_SID
ファイルで.env
を定義しましたが、コンソールで値を出力しようとするとすぐに、undefined
であるというエラーが表示されます。
この問題のトラブルシューティング方法についてご提案がある場合は、非常に高く評価されます。
私の場合、_.env
_を使用して_process.env.MY_KEY
_ファイルからキーを取得しようとするたびに、undefined
を返しました。
_keys.env
_ファイルとは見なされない_.env
_のような名前をファイルに付けたからといって、この問題に2時間悩まされました。
トラブルシューティングリストは次のとおりです。
ファイル名は_.env
_である必要があります(_.env.test
_も受け入れられると思います)。
このステートメントrequire('dotenv').config();
を使用して、アプリケーションでできるだけ早く要求していることを確認してください
_.env
_ファイルは、プロジェクトのrootディレクトリにある必要があります。
_DB_Host=localhost
_のような「ファイル記述規則」に従ってください。値を二重/単一引用符で囲む必要はありません。
また、 NPMサイトのパッケージのドキュメント を確認してください。
私はこれを使って解決しました:
require('dotenv').config({path: __dirname + '/.env'})
または絶対パスで:
C:\\asd\\auhsd\\.env
.env
ファイルが見つからない場合、undefined
を返します。
トラブルシューティングの時間を節約し、次のように必要な呼び出しを記録します。
console.log(require('dotenv').config())
問題に関するより詳細な情報を含むエラーが表示されるはずです。
最近同じ問題がありました。 .env
ファイルとコロンではなく等号を使用します。以下に例を示します。
key=value
の代わりに:
key:value
dotenvモジュールのドキュメントにあるように、環境変数を正しい形式に入れませんでしたTWILIO_CALLER_ID = "+ wwehehe"をエクスポートしていたため、dotenvモジュールがファイルを正しく解析していませんでした。宣言からexportキーワードを削除し、すべてが正常に機能することに気付いたとき。
同じ問題がありました。私のファイルはUCS-2 BE BOM
で何らかの形でエンコードされていることに気付きました。 .env
ファイルをUTF-8
に変換すると修正されました(たとえば、Notepad ++を使用して簡単に実行できます)。
変数がまだ設定されていないことを確認してください。 Dotenvはそれらを上書きしません。
変数が設定されている場合、それらを削除する必要があります。 PowerShellでは、次のコマンドを使用できます- ここで述べたように :
Remove-Item Env:\MyTestVariable
Dotenv.config()を呼び出す場合は、pm2構成のcwdを正しいディレクトリに設定してください。
例:index.jsファイルは/ app/srcにあり、.envファイルは/ appにあります。あなたのindex.jsファイルにはこれがあります
dotenv.config({path: "../.env"});
Pm2 json configには、「cwd」:「/ app/src」、「script」:「index.js」が必要です。
Dotenv.config({path:path.join(__ dirname、 "../.env")});も使用できます。 CWDの問題を回避するため。 .envまたはindex.jsファイルを相互に移動すると、依然として問題が発生します。
また、[〜#〜] root [〜#〜]フォルダーからNodeスクリプトを実行することにも注意してください。 。
例えば。 ./bin/test.js
というサブフォルダーでテストスクリプトを使用していました。次のように呼び出します:node ./bin/test.js
はまったく問題なく動作しました。次のようなサブフォルダーから呼び出します:
$ pwd
./bin
$ node ./test.js
dotenv
が./.env
ファイルを見つけられないようにします。
私は同じ問題を抱えていたので、4時間かけて障害を見つけようとしました。私の場合、それは奇妙でした。
「node app.js」を試してみたところ、うまくいきました。デーモンを起動したかったのですが、動作しませんでした。
問題をどのように解決しましたか?私は置き換えました:
var dotenv = require('dotenv');
dotenv.load();
で:
var dotenv = require('dotenv').config({path: path.join(__dirname, '.env')})
私の問題は愚かだった。テキストエディターで.envを作成し、保存すると実際に
'.env.txt'
私がやった後にしか見えませんでした
'ls -a'
ターミナルでファイル名を見ました。
クイック:
mv .env.txt .env
そして私はビジネスをしていた
.env変数がロードされず、undefined
であることにも問題がありました。
私が試したもの:
index.js:
_import dotenv from 'dotenv';
dotenv.config();
import models from './models';
_
models.js
_import Sequelize from 'sequelize';
const sequelize = new Sequelize(
process.env.DATABASE,
process.env.DATABASE_USER,
process.env.DATABASE_PASSWORD,
{
dialect: 'postgres',
}
);
_
どうやら、nodejsでのインポートのロード方法のため、_index.js
_のモデルのインポートにより、models.jsがdotenv.config()
の前に実行されたようです。したがって、process.envから未定義の値を取得しました。
Models.jsを変更して、次のようなdotenv構成を実行したとき:
_import Sequelize from 'sequelize';
import dotenv from 'dotenv';
dotenv.config();
const sequelize = new Sequelize(
process.env.DATABASE,
process.env.DATABASE_USER,
process.env.DATABASE_PASSWORD,
{
dialect: 'postgres',
}
);
_
動き始めました!
「.env」ファイルは、ノードjsサーバーファイル(server.jsまたは私用)のルートディレクトリにある必要があります。
プロジェクトのルートに「.env」ファイルを配置した場合、機能しません。私の間違いは、server.jsファイルが「controller」という名前のフォルダーにネストされていることです。
そのため、server.jsファイルと同じディレクトリに.envファイルを配置して、修正する必要がありました。
同じ問題があった。 dotenv-webpack
を使用し、定義する必要があります
plugins: [
new Dotenv()
]
in both webpack production and webpack base files(私はwebpack mergeを使用しています)両方のファイルで定義されていない場合、機能しませんでした。
文字通り.envファイルには名前を使用せず、.env拡張子を付けてそのようなファイルを保存するだけで、うまくいきました。
私の場合、ラッパーJSファイルを作成しました。このファイルには、環境に応じて適切な変数を動的に選択するロジックがあります。
これら2つの関数があります。1つは単純なdotenv機能のラッパーであり、もう1つは環境を区別して、結果をprocess.envオブジェクトに設定します。
setEnvVariablesByEnvironment : ()=>{
return new Promise((resolve)=>{
if (process.env.NODE_ENV === undefined || process.env.NODE_ENV ==='development'){
logger.info('Lower / Development environment was detected');
environmentManager.getEnvironmentFromEnvFile()
.then(envFile => {
resolve(envFile);
});
}else{
logger.warn('Production or Stage environment was detected.');
resolve({
payload: process.env,
flag: true,
status: 0,
log: 'Returned environment variables placed in .env file.'
});
}
});
} ,
/*
Get environment variables from .env file, using dotEnv npm module.
*/
getEnvironmentFromEnvFile: () => {
return new Promise((resolve)=>{
logger.info('Trying to get configuration of environment variables from .env file');
env.config({
debug: (process.env.NODE_ENV === undefined || process.env.NODE_ENV === 'development')
});
resolve({
payload: process.env,
flag: true,
status: 0,
log: 'Returned environment variables placed in .env file.'
});
});
},
だから、私のserver.jsファイルに参照を追加しただけです:
const envManager = require('./lib/application/config/environment/environment-manager');
そして、私のエントリポイント(server.js)では、使用するだけで簡単です。
envManager.setEnvVariablesByEnvironment()
.then(envVariables=>{
process.env= envVariables.payload;
const port = process.env.PORT_EXPOSE;
microService.listen(port, '0.0.0.0' , () =>{
let welcomeMessage = `Micro Service started at ${Date.now()}`;
logger.info(welcomeMessage);
logger.info(`${configuration.about.name} port configured -> : ${port}`);
logger.info(`App Author: ${configuration.about.owner}`);
logger.info(`App Version: ${configuration.about.version}`);
logger.info(`Created by: ${configuration.about.author}`);
});
});
これを解決するには、ファイルの名前を.envからyに変更するだけでconfig.envという名前になり、.envに名前を変更したときに機能します。