5
respostas

[Bug] MongooseError: The `uri` parameter to `openUri()` must be a string

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.

Pessoal, boa noite.

Estou enfrentando este bug e meu código do dbConnect.js é este:

import mongoose from "mongoose";

async function conectaNaDatabase() {
    mongoose.connect(process.env.DB_CONNECTION_STRING);
    return mongoose.connection;
};

export default conectaNaDatabase;

O que será que pode ser? Nesta parte do return mongoose.connection eu decidi colocar create também antes do connection mas ele depois informa outro erro que seria no app.js, afirma que conexao.on não existe.

5 respostas

Olá, Arthur! Tudo bem?

O erro "The uri parameter to openUri() must be a string, got "undefined"" significa que a função mongoose.connect() está recebendo um valor undefined em vez de uma string.

No seu código, você está tentando passar a string de conexão através da variável de ambiente DB_CONNECTION_STRING:

mongoose.connect(process.env.DB_CONNECTION_STRING);

Então, o primeiro passo é verificar se você definiu corretamente essa variável de ambiente no seu arquivo .env. Deve ser algo parecido com isso:

DB_CONNECTION_STRING=mongodb+srv://usuario_exemplo:senhaExemplo@cluster.vk11mjl.mongodb.net/

Além disso, para acessar as variáveis de ambiente, você precisa usar o pacote dotenv e configurá-lo corretamente. Adicione no início do seu arquivo dbConnect.js:

import dotenv from 'dotenv';
dotenv.config();

Isso fará com que as variáveis de ambiente definidas no arquivo .env estejam disponíveis em process.env.

Se você fez tudo isso e o erro persistir, tente imprimir a variável process.env.DB_CONNECTION_STRING antes de passá-la para mongoose.connect(), para verificar se ela está sendo lida corretamente:

console.log(process.env.DB_CONNECTION_STRING);
mongoose.connect(process.env.DB_CONNECTION_STRING);

Se o console imprimir undefined, então há algo errado com a forma como você está definindo ou acessando suas variáveis de ambiente.

Espero ter ajudado e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.

Olá, tudo bem?

Primeiramente, muito obrigado por tentar me ajudar a solucionar este problema.

Meu .env:

DB_CONNECTION_STRING=mongodb+srv://admin:admin123@cluster0.i5hkqpv.mongodb.net/

Meu dbConnect.js (Tentei colocar o console.log do mongoose antes, mas não funcionou):

import mongoose from "mongoose";

async function conectaNaDatabase() {
    mongoose.connect(process.env.DB_CONNECTION_STRING);
    return mongoose.connection;
};

export default conectaNaDatabase;

Obs: Eu também tentei colocar o dotenv.config(); mas ele dá outro undefined, dizendo que não tem nada dentro do parênteses.

Meu app.js:

import express from "express";
import conectaNaDatabase from "./dbConnect.js";
import routes from "./routes/index.js";

const conexao = await conectaNaDatabase();

conexao.on("error", (erro) => {
    console.error("erro de conexão", erro)
});

conexao.once("open", () => {
  console.log("Conexão com o banco feito com sucesso!")
})

const app = express();
routes(app);

app.get("/livros/:id", (req, res) => {
  const index = buscaLivro(req.params.id);
  res.status(200).json(livros[index]);
})

app.post("/livros", (req, res) => {
  livros.push(req.body);
  res.status(201).send("livro cadastrado com sucesso");
});

app.put("/livros/:id", (req, res) => {
  const index = buscaLivro(req.params.id);
  livros[index].titulo = req.body.titulo;
  res.status(200).json(livros);
});

app.delete("/livros/:id", (req, res) => {
  const index = buscaLivro(req.params.id);
  livros.splice(index, 1);
  res.status(200).send("livro removido com sucesso");
});

export default app;

Será que há algo errado? Se precisar de mais algum arquivo, por favor só me dizer. (Eu estou na luta de aprender, por isso a insistência para resolver, é frustrante mas vale a pena).

Bom dia, Arthur!

Como não sei a estrutura do seu projeto, no quesito de organização de pastas e arquivos, criei um projeto teste para auxiliar nos testes dos seus códigos. Nele identifiquei que o problema estava na forma em que você está usando o env, você esqueceu de importar a biblioteca dotenv antes de usá-lo.

Então, no seu arquivo "dbConnect.js", você deve alterar sua estrutura para ficar da seguinte forma:

import mongoose from "mongoose";
import dotenv from 'dotenv';
dotenv.config();

async function conectaNaDatabase() {
    mongoose.connect(process.env.DB_CONNECTION_STRING);
    return mongoose.connection;
};

export default conectaNaDatabase;

OBS: para usar o dotenv é necessário instalar ele usando o comando npm install dotenv, depois pode seguir usando a estrutura que compartilhei acima

Além de que, antes, eu cometi um equívoco na minha resposta, a sua string de conexão deve estar envolvida por aspas, exemplo:

DB_CONNECTION_STRING='mongodb+srv://usuarioAqui:senhaAqui@cluster.vk10mjl.mongodb.net/ClusterAqui'

Imagino que isso possa resolver a sua situação, caso não, peço que compartilhe todo o seu projeto. Você pode fazer isso via GitHub ou Drive do Google, lembre de não subir a pasta "node_modules", ela é desnecessariamente grande e sempre podemos ter ela ao executar o comando npm install.

Fico no aguardo e à disposição

Boa noite! Estou com o mesmo problema, mesmo seguindo todos estes passos o erro é o mesmo:

*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.*

Ao tentar imprimir a variável de ambiente, exibe undefined no console. Testei colocar a string direto no connect e funcionou, mas com a variável dá erro. Exemplo:

mongoose.connect(process.env.DB_CONNECTION_STRING);  //error
mongoose.connect('string completa'); // conecta normalmente

Boa tarde, amigo!

O problema que você está tendo é diretamente relacionado com a forma que você está adicionando a string de conexão no método de conexão do Mongoose, o mongoose.connect().

Pois, existem alguns passos que devem ser feitos antes de passar essa string de conexão, que seria a sua definição em um determinado arquivo e o download da biblioteca responsável por coletar essa string do arquivo e passar para o método mongoose.connect().

A configuração do arquivo ".env" no seu projeto deveria estar da seguinte forma:

DB_CONNECTION_STRING='mongodb+srv://usuarioAqui:senhaAqui@cluster.vk10mjl.mongodb.net/ClusterAqui'

Além disso, deve ter a biblioteca virtualenv, para fazer o download dela você deve usar o comando:

pip install virtualenv

Por fim, caso analisando esses pontos o seu problema não seja solucionado, peço que inicie outro tópico no fórum, para trabalhamos melhor o seu caso. Nesse novo tópico, compartilhe mais informações sobre o seu projeto, como, prints ou trechos de códigos, ou simplesmente compartilhe todo o seu projeto.

Boa sorte nos estudos!