Estive lendo e lendo e ainda estou confuso sobre qual é a melhor maneira de compartilhar a mesma conexão de banco de dados (MongoDb) em todo o aplicativo NodeJs. Pelo que entendi a conexão deve ser aberta quando o aplicativo é iniciado e reutilizada entre os módulos. Minha ideia atual da melhor maneira é que server.js
(arquivo principal onde tudo começa) se conecte ao banco de dados e crie variáveis de objeto que são passadas para os módulos. Uma vez conectada, esta variável será usada pelo código dos módulos conforme necessário e esta conexão permanecerá aberta. Por exemplo:
var MongoClient = require('mongodb').MongoClient;
var mongo = {}; // this is passed to modules and code
MongoClient.connect("mongodb://localhost:27017/marankings", function(err, db) {
if (!err) {
console.log("We are connected");
// these tables will be passed to modules as part of mongo object
mongo.dbUsers = db.collection("users");
mongo.dbDisciplines = db.collection("disciplines");
console.log("aaa " + users.getAll()); // displays object and this can be used from inside modules
} else
console.log(err);
});
var users = new(require("./models/user"))(app, mongo);
console.log("bbb " + users.getAll()); // not connected at the very first time so displays undefined
em seguida, outro módulo se models/user
parece com isso:
Users = function(app, mongo) {
Users.prototype.addUser = function() {
console.log("add user");
}
Users.prototype.getAll = function() {
return "all users " + mongo.dbUsers;
}
}
module.exports = Users;
Agora tenho uma sensação horrível de que isso é errado, então há algum problema óbvio com essa abordagem e, se houver, como torná-la melhor?
fonte
module.exports = mongoist(connectionString);
. (Leia sobreconnectionString
no Manual do MongoDB.)Respostas:
Você pode criar um
mongoUtil.js
módulo que tenha funções para conectar ao mongo e retornar uma instância db do mongo:Para usá-lo, você faria isso em
app.js
:E então, quando você precisar acessar o mongo em outro lugar, como em outro
.js
arquivo, você pode fazer isto:A razão pela qual isso funciona é que no nó, quando os módulos são
require
'd', eles são carregados / originados apenas uma vez, então você sempre terminará com uma instância de_db
emongoUtil.getDb()
sempre retornará essa mesma instância.Nota, código não testado.
fonte
app.js
dentro da função de retorno de chamada deconnectToServer
. Se você configurá-require
losapp.js
antes_db
, obterá erros indefinidos nos outros módulos.var database = mongoUtil.getDb(); database.db().collection( 'users' )
.Há muitas maneiras de ajustar isso para aceitar objetos de configuração em locais, mas, no geral, é semelhante à forma como você organiza o código, embora com sintaxe JS mais moderna. Poderia ser facilmente reescrito em protótipos e callbacks, se essa for sua necessidade.
mongo.js
Users.js
app.js
someFile.js
fonte
Veja como faço isso com a sintaxe contemporânea, com base no exemplo de go-oleg. O meu é testado e funcional.
Eu coloquei alguns comentários no código.
fonte
Se você estiver usando o Express, poderá usar o módulo express-mongo-db que permite obter a conexão db no objeto de solicitação.
Instalar
server.js
rotas / users.js
fonte
go-oleg está basicamente certo, mas atualmente você (provavelmente) não quer usar o "mongodb" propriamente dito, ao invés disso, usar algum framework, que fará muito "trabalho sujo" para você.
Por exemplo, o mangusto é um dos mais comuns. Isso é o que temos em nosso
server.js
arquivo inicial :Isso é tudo o que é necessário para configurá-lo. Agora use isso em qualquer lugar do seu código
E você obtém aquela instância que configurou com
mongoose.connect
fonte
Inicialize a conexão como uma promessa:
Em seguida, chame a conexão sempre que desejar, execute uma ação no banco de dados:
fonte
Uma solução testada com base na resposta aceita:
mongodbutil.js:
app.js:
Activities.js - uma rota:
fonte
Aqui está minha configuração em 2020:
./utils/database.js
/app.js
fonte
podemos criar um arquivo dbconnection como dbconnection.js
e usar este arquivo em seu aplicativo, como
e usar assim dentro de sua função assíncrona
espero que funcione
fonte
Estou um pouco atrasado para isso, mas adicionarei minha solução também. É uma abordagem muito noobier em comparação com as respostas aqui.
De qualquer forma, se você estiver usando o MongoDB versão 4.0 e Node.js 3.0 (ou versões superiores), você pode usar a
isConnected()
função doMongoClient
.Isso funcionou bem pra mim. Espero que ajude.
fonte
Estou atrasado para a festa, mas espero que esta resposta ajude alguém, este é um código funcional:
db.js
Exportamos uma função para conectar ao mongo e outra para obter uma instância da conexão.
app.js
Devemos fazer o require do módulo auth após inicializarmos a conexão, caso contrário, a função getDb retornará indefinida.
module.js
fonte
Como isso está marcado com o Express, pensei em mencionar que o Express tem um recurso integrado para compartilhar dados entre as rotas. Existe um objeto chamado app.locals. Podemos anexar propriedades a ele e acessá-lo de dentro de nossas rotas. Você simplesmente instancia sua conexão mongo em seu arquivo app.js.
Esta conexão de banco de dados agora pode ser acessada dentro de suas rotas como abaixo, sem a necessidade de criar e exigir módulos adicionais.
Este método garante que você tenha uma conexão de banco de dados aberta durante todo o seu aplicativo, a menos que você opte por fechá-la a qualquer momento. É facilmente acessível
req.app.locals.your-collection
e não requer módulos adicionais.fonte
Se você optar por usar mongoose em seu aplicativo, edite seu arquivo app.js com o seguinte snippet
app.js
Próxima etapa: Definir modelos para sua aplicação, solicite-os e execute a operação CRUD diretamente, por exemplo
blogSchema.js
Uso createBlog.js
Você não precisa se conectar ao mogoDB sempre ....
fonte
fonte
fonte
Acho que funciona bem :)
mongoUtil.ts
anyFile.ts
fonte
javascript
, não acho que uma resposta TypeScript seja apropriada.