#node.js #mongodb #heroku #mongoose #web-deployment
#node.js #mongodb #героку #мангуст #веб-развертывание
Вопрос:
Когда я пытаюсь развернуть свое приложение на heroku, оно выдает мне следующую ошибку:
MongooseError:
uri
Параметр toopenUri()
должен быть строкой, получил значение «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’ использовать эти переменные.