Mam aplikację, w której lokalnie (bez PM2) wszystkie zmienne środowiskowe w pliku .env działa dobrze za pomocą dotenv.

Ale na serwerze, w którym używam pm2, aby uruchomić aplikację, zmienne środowiskowe pozostają undefined.

Polecenia PM2 Używam do uruchomienia aplikacji na serwerze:

pm2 start myapp/app.js
pm2 startup
pm2 save
13
m-ketan 5 czerwiec 2018, 01:31

5 odpowiedzi

Najlepsza odpowiedź

dotenv Odczytuje plik .env umieszczony w bieżącym katalogu.

Po zadzwonieniu pm2 start myapp/app.js nie będzie wyszukiwać myapp/.env.

.env // It will try to load this, which doesn't exist
myapp/
   app.js

Więc masz dwa rozwiązania

Użyj opcji path:

const path = require('path'); 
require('dotenv').config({ path: path.join(__dirname, '.env') });

Lub zadzwoń do swojego skryptu od wewnątrz {x0}}}

pm2 start app.js
43
Marcos Casagrande 4 czerwiec 2018, 23:01

Dobrym wzorem tutaj jest usunięcie Dotenv z kodu i "wymagać" go w wierszu poleceń. To sprawia, że Twój kod jest ładnie przenośny między dowolnym środowiskiem (w tym na bazie chmur) - która jest jedną z głównych cech zmiennych środowiskowych.

Uwaga: Nadal będziesz musiał zainstalować Dotenv w projekcie za pośrednictwem NPM podczas uruchamiania go na serwerze.

A) koduj plik .Env obok skryptu (np. app.js)

B) Uruchomienie skryptu bez PM2:

node -r dotenv/config app.js

C) w PM2.Config.js:

module.exports = {
  apps : [{
    name      : 'My Application',
    script    : 'app.js',
    node_args : '-r dotenv/config',
    ...
  }],
}

I wtedy pm2 start pm2.config.js

Uwaga: Korzystanie z Dotenv / Config w linii poleceń jest jedną z najlepszych praktyk zalecanych przez Dotenv Sami

15
Andy Lorenz 2 styczeń 2020, 15:26

Używam znacznie prostszej wersji odpowiedzi @marcos:

.env
app.js

Na przykład musimy przechowywać token w pliku .env i przekazać go do app.js: wewnątrz .env.

token=value

Wewnątrz app.js:

require('dotenv').config();
console.log(process.env.token)

Również nie zapomnij. Jeśli dodasz plik .ENV do

W niektórych przypadkach ważne jest, w jakim obszarze używasz swojej konfiguracji, więc upewnij się, że NODE_ENV=production ciąg zostanie dodany do pliku .Env.

Po tym wszystkim możesz użyć pm2 start app.js bezpośrednio z folderu aplikacji.

0
AlexZeDim 2 styczeń 2020, 16:16

Miałem ten sam problem, ale nie wyjaśnił wyraźnie, więc tutaj jest rozwiązanie Github Użytkownik Vmarchaud Komentarz. To również naprawia, że ludzie mieli z rozwiązaniem @ANdy Lorenz.

W moim przypadku chciałem utworzyć plik ekosystemowy dla wielu aplikacji, ale byłem dostać

Error: Cannot find module 'dotenv/config'

Rozwiązanie było łatwe. Musisz zadeklarować CWD, aka folder projektu, w którym można odczytać Dotenv / Config.

module.exports = {
  apps: [{
    name: 'app1 name',
    script: 'app1.js',
    cwd: '/path/to/folder/',
    exec_mode: 'fork_mode',
    node_args: '-r dotenv/config',
  }, {
    name: 'app2 name',
    script: 'app2.js',
    cwd: '/path/to/folder/',
    instances: 'max',
    exec_mode: 'cluster',
    node_args: '-r dotenv/config',
  }],
};
2
wzy 1 czerwiec 2020, 15:47

Najpierw zabiłeś proces PM2

Próbować

pm2 kill

Następnie uruchom ponownie PM2 za pomocą

pm2 start app.js
5
Ahmed 22 czerwiec 2020, 22:47