web-dev-qa-db-ja.com

Node.jsでdotenvファイルを設定するにはどうすればよいですか?

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であるというエラーが表示されます。

この問題のトラブルシューティング方法についてご提案がある場合は、非常に高く評価されます。

36
user3775998

私の場合、_.env_を使用して_process.env.MY_KEY_ファイルからキーを取得しようとするたびに、undefinedを返しました。

_keys.env_ファイルとは見なされない_.env_のような名前をファイルに付けたからといって、この問題に2時間悩まされました。

トラブルシューティングリストは次のとおりです。

  1. ファイル名は_.env_である必要があります(_.env.test_も受け入れられると思います)。

  2. このステートメントrequire('dotenv').config();を使用して、アプリケーションでできるだけ早く要求していることを確認してください

  3. _.env_ファイルは、プロジェクトのrootディレクトリにある必要があります。

  4. _DB_Host=localhost_のような「ファイル記述規則」に従ってください。値を二重/単一引用符で囲む必要はありません。

また、 NPMサイトのパッケージのドキュメント を確認してください。

53

私はこれを使って解決しました:

require('dotenv').config({path: __dirname + '/.env'})

または絶対パスで:

C:\\asd\\auhsd\\.env

.envファイルが見つからない場合、undefinedを返します。

29
teliz

トラブルシューティングの時間を節約し、次のように必要な呼び出しを記録します。

console.log(require('dotenv').config())

問題に関するより詳細な情報を含むエラーが表示されるはずです。

14
user3006381

最近同じ問題がありました。 .envファイルとコロンではなく等号を使用します。以下に例を示します。

key=value

の代わりに:

key:value
8
unplugged

dotenvモジュールのドキュメントにあるように、環境変数を正しい形式に入れませんでしたTWILIO_CALLER_ID = "+ wwehehe"をエクスポートしていたため、dotenvモジュールがファイルを正しく解析していませんでした。宣言からexportキーワードを削除し、すべてが正常に機能することに気付いたとき。

7
user3775998

同じ問題がありました。私のファイルはUCS-2 BE BOMで何らかの形でエンコードされていることに気付きました。 .envファイルをUTF-8に変換すると修正されました(たとえば、Notepad ++を使用して簡単に実行できます)。

変数がまだ設定されていないことを確認してください。 Dotenvはそれらを上書きしません。

変数が設定されている場合、それらを削除する必要があります。 PowerShellでは、次のコマンドを使用できます- ここで述べたように

Remove-Item Env:\MyTestVariable
5
Korte

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ファイルを相互に移動すると、依然として問題が発生します。

4
Ahmed Jehanzaib

また、[〜#〜] root [〜#〜]フォルダーからNodeスクリプトを実行することにも注意してください。 。

例えば。 ./bin/test.jsというサブフォルダーでテストスクリプトを使用していました。次のように呼び出します:node ./bin/test.jsはまったく問題なく動作しました。次のようなサブフォルダーから呼び出します:

$ pwd
./bin
$ node ./test.js

dotenv./.envファイルを見つけられないようにします。

4
Knowledge

私は同じ問題を抱えていたので、4時間かけて障害を見つけようとしました。私の場合、それは奇妙でした。

「node app.js」を試してみたところ、うまくいきました。デーモンを起動したかったのですが、動作しませんでした。

問題をどのように解決しましたか?私は置き換えました:

var dotenv = require('dotenv');
dotenv.load();

で:

var dotenv = require('dotenv').config({path: path.join(__dirname, '.env')})
4
ndsvw

私の問題は愚かだった。テキストエディターで.envを作成し、保存すると実際に

'.env.txt' 

私がやった後にしか見えませんでした

'ls -a'

ターミナルでファイル名を見ました。

クイック:

mv .env.txt .env

そして私はビジネスをしていた

2
Mike Baker

.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',
    }
);
_

動き始めました!

2
andnyl

「.env」ファイルは、ノードjsサーバーファイル(server.jsまたは私用)のルートディレクトリにある必要があります。

プロジェクトのルートに「.env」ファイルを配置した場合、機能しません。私の間違いは、server.jsファイルが「controller」という名前のフォルダーにネストされていることです。

そのため、server.jsファイルと同じディレクトリに.envファイルを配置して、修正する必要がありました。

2
ConfusedDeer

同じ問題があった。 dotenv-webpackを使用し、定義する必要があります

plugins: [
  new Dotenv()
]

in both webpack production and webpack base files(私はwebpack mergeを使用しています)両方のファイルで定義されていない場合、機能しませんでした。

1
user1665355

文字通り.envファイルには名前を使用せず、.env拡張子を付けてそのようなファイルを保存するだけで、うまくいきました。

0
Daniel Zavala

私の場合、ラッパー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}`);

    });
});
0
Alex Torres

これを解決するには、ファイルの名前を.envからyに変更するだけでconfig.envという名前になり、.envに名前を変更したときに機能します。

0