Cómo conectar mongodb con la base de datos digital del océano usando mongoose. Probé de esta manera no funciona. Aunque en local dice Error: ENAMETOOLONG: nombre demasiado largo, abierto al CA_CERT. Por favor guíe
mongoose .connect(process.env.HOST, { useNewUrlParser: true, useCreateIndex: true, ssl: true, sslCA: process.env.CA_CERT.replace(/\\n/g, '\n') })El siguiente enfoque funcionó para mí
const mongoose = require("mongoose"); const colors = require("colors"); const path = require("path"); module.exports = async (server) => { try { let mongoCertPath = path.resolve("./config/ca-certificate.crt"); if (process.env.CA_CERT) { fs.writeFileSync(mongoCertPath, process.env.CA_CERT); } await mongoose.connect(process.env.MONGO_URI, { useNewUrlParser: true, useUnifiedTopology: true, tlsCAFile: mongoCertPath }); console.log("mongo connection successful..".yellow); server.listen(process.env.PORT || 5000, () => console.log( `server running on ${process.env.NODE_ENV} mode, port ${process.env.PORT}..` .yellow ) ); } catch (error) { console.log("mongo connection failed..".red); console.log(error); process.exit(1); } };mi .env se ve así
MONGO_URI = mongodb+srv://doadmin:xxxxxx@db-mongodb-blrxx1-xxxxx-xxxxx.mongo.ondigitalocean.com/admin?authSource=admin&replicaSet=db-mongodb-blr1-xxxxx&tls=trueComo entiendo, Mongoose no tiene ninguna propiedad para configurar el contenido TLS CRT (variable CA_CERT env de DigitalOcean), decidí crear un archivo CRT sobre la marcha y luego usarlo para conectarme a la base de datos, luego eliminar el archivo creado.
const filenameToCreate = 'test.crt'; fs.writeFileSync(filenameToCreate, process.env.CA_CERT); mongoose.connect(dbConnectionUri, { useNewUrlParser: true, useUnifiedTopology: true, tlsCAFile: filenameToCreate }).then((ers) => { app.listen(port, () => console.log(`server is listening on ${port}`)); }).catch(err => { console.log(err); }).finally(() => { fs.unlinkSync(filenameToCreate); })No estoy seguro de que este sea un enfoque aceptable.
debe tener un certificado de CA en el almacenamiento local. este código usado con express y babel:
importar fs desde 'fs'; importar mangosta de 'mangoose';
let mongoCertPath = "./SSL/ca-certificate.crt";
if (fs.existsSync(mongoCertPath)) { mongoose.Promise=global.Promise; mongoose.connect(process.env.MONGO_URI,{ useNewUrlParser: true, useUnifiedTopology: true, ssl: true, tlsCAFile: mongoCertPath }).then( ()=>{ console.log('conectado a digitalOcean mongoDB: db_default'); }, err=>{console.log('error conectando digitalOcean mongoDB:'+err);} ); }else{ console.log('no existe el -> SSL ca-certificate.crt') }