Файл .env не распознается при попытке чтения из файла в папке вместо root в NodeJS - PullRequest
0 голосов
/ 09 июля 2020

В моем приложении NodeJS у меня есть файл .env в каталоге root со следующей информацией:

NODE_ENV = development
PORT = 3002
#db credentials
dbURL = 'mongodb+srv://username:password@clusterName-0gcm3.mongodb.net/dbName?retryWrites=true&w=majority'

И в каталоге root у меня также есть файл конфигурации (config. js), который захватывает переменные:

const dotenv = require('dotenv');
dotenv.config();

module.exports = {
  port: process.env.PORT,
  dbURL: process.env.dbURL
}

В моем приложении. js, которое снова находится в папке root. Я могу успешно прочитать этот файл и подключиться к БД:

const express = require('express');
const mongoose = require('mongoose');
const { port, dbURL } = require('./config');  //reading the config file and grabbing the vars
const app = express();

app.use(express.json());

//works well!
mongoose.connect(dbURL, { useUnifiedTopology: true, useNewUrlParser: true})
        .then(res => {
          console.log(`Listening on port ${port}`);
          app.listen(port);
        })
        .catch(err => console.error(err));

Теперь я пытаюсь написать несколько автономных сценариев для заполнения БД некоторыми образцами данных, и в этом сценарии я пытаюсь подключиться к БД отдельно, поскольку эти сценарии будут выполняться только с командой node <file>. Этот файл (dbPopulate. js) находится в папке / helper-scripts /. И сценарий выглядит так:

const express = require('express');
const mongoose = require('mongoose');
const {port, dbURL} = require('../config'); //attempting to read config.js that calls the .env file

const app = express();
app.use(express.json());


console.log(dbURL, port) //throws undefined for both vars
mongoose.connect(dbURL, { useUnifiedTopology: true, useNewUrlParser: true})
        .then(res => {
          console.log(`Listening on port ${port}`);
          app.listen(port);
        })
        .catch(err => console.error(err));

Чтобы было понятно, это моя файловая структура:

/.env
/app.js
/config.js
/helper-scripts/dbPopulate.js  (culprit)

ОБНОВЛЕНИЕ для отображения журнала ошибок:

Когда я выполнить dbPopulate. js standalone Я получаю следующие ошибки:

$ node dbPopulate.js
undefined undefined
C:\teamSIO\server\node_modules\mongoose\lib\connection.js:582
    throw new MongooseError('The `uri` parameter to `openUri()` must be a ' +
    ^

MongooseError: The `uri` parameter to `openUri()` must be a string, got "undefined". Make sure the first parameter to `mongoose.connect()` or `mongoose.createConnection()` is a string.
    at NativeConnection.Connection.openUri (C:\teamSIO\server\node_modules\mongoose\lib\connection.js:582:11)
    at Mongoose.connect (C:\teamSIO\server\node_modules\mongoose\lib\index.js:335:15)
    at Object.<anonymous> (C:\teamSIO\server\helper-scripts\dbPopulate.js:30:10)
    at Module._compile (internal/modules/cjs/loader.js:1123:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1143:10)
    at Module.load (internal/modules/cjs/loader.js:972:32)
    at Function.Module._load (internal/modules/cjs/loader.js:872:14)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:71:12)
    at internal/main/run_main_module.js:17:47

1 Ответ

0 голосов
/ 09 июля 2020

Я бы попробовал использовать массив вместо объекта.

require('dotenv').config();
const port = process.env.PORT;
dbURL: process.env.dbURL;
module.exports = [
    port,
    dbURL
];

и использовать

const [port, dbURL] = require('./config');

Кроме того, я не думаю, что это была ошибка, но вы в вашем файле "dbPopulate. js" const {port, dbURL} = require('../config'); есть две точки, это может быть ваша проблема

...