MongooseError: параметр `uri` для `OpenURI ()` должен быть строкой, получил «undefined». Убедитесь, что первый параметр для `mongoose.connect()` является строкой

#node.js #mongodb #heroku #mongoose #web-deployment

#node.js #mongodb #героку #мангуст #веб-развертывание

Вопрос:

Когда я пытаюсь развернуть свое приложение на heroku, оно выдает мне следующую ошибку:

MongooseError: uri Параметр to openUri() должен быть строкой, получил значение «undefined». Убедитесь, что первый параметр для mongoose.connect() или mongoose.createConnection() является строкой.

когда я развертываю приложение локально, оно работает нормально. Я прочитал другой вопрос, и общим решением является перемещение файла .env в корневой каталог. Проблема в том, что у меня это уже есть. я думаю, что я делаю что-то неправильно при передаче dsn базы данных функции mongoose.connect().

здесь импорт в app.js файл:

 const express = require('express');
const path = require('path');
const cookieParser = require('cookie-parser');
const session = require('express-session');
const MongoStore = require('connect-mongo')(session) //session come argomento
const compression = require('compression') //session come argomento

const port = process.env.PORT || 8080;

require('dotenv').config();
const config = require('./config/Config.js'); // [process.env.NODE_ENV || 'test']
const datiRegioniAPI = require('./DatiRegioniAPI');
const db = require ('./lib/db.js');
const userService = require('./services/UserService.js');
const mongoose = require('mongoose');
const aut = require('./lib/aut.js');
const helmet = require("helmet")
const app = express();
 

здесь функция db.connect в app.js файл:

 db.connect(config.production.dsn)
   .then(()=>{
      app.listen(port,(err)=>{
         if(err){console.error(err, "### ERRORE CONNESSIONE DB");}
         else{console.log("connected on ", port);}
      })
   })
   .catch((err)=>{
      console.error(err, "### CATCH error db connection");
   })
 

это мой config.js файл:

 const path = require("path");


module.exports = {
    data:{
        avatars: path.join(__dirname, "../data/avatars")
    },
    test : {
        dsn: process.env.TEST_DB_DSN,
    },
    production : {
        dsn: process.env.PRODUCTION_DB_DSN,
    }
}
 

это мой db.js файл:

Я в основном экспортирую эту функцию в app.js файл как промежуточное программное обеспечение

 const mongoose = require('mongoose')
mongoose.set('useNewUrlParser', true);
mongoose.set('useFindAndModify', false);
mongoose.set('useCreateIndex', true);
mongoose.set('useUnifiedTopology', true);



module.exports.connect = async dsn => {
    mongoose.connect(dsn) 
}

 
 

Это странная проблема, потому что она отлично работает локально, но не работает
вообще при развертывании на heroku

Ответ №1:

При развертывании приложения в рабочей среде

require(‘dotenv’).config()

неэффективно, и вы не найдете переменные в рабочей среде. поэтому мое решение состояло в том, чтобы вручную добавить переменные env в Heroku и в случае NODE_ENV==’production’ использовать эти переменные.