我使用Node-Mongo-Native并试图设置一个全局连接变量,但我对两种可能的解决方案感到困惑.你们能帮我找出哪一个是好的吗?

var express = require('express');  
var app = express();  
var MongoClient = require('mongodb').MongoClient;  
var assert = require('assert');

// Connection URL
var url = '[connectionString]]';

// start server on port 3000
app.listen(3000, '0.0.0.0', function() {  
  // print a message when the server starts listening
  console.log("server starting");
});

// Use connect method to connect to the server when the page is requested
app.get('/', function(request, response) {  
  MongoClient.connect(url, function(err, db) {
    assert.equal(null, err);
    db.listCollections({}).toArray(function(err, collections) {
        assert.equal(null, err);
        collections.forEach(function(collection) {
            console.log(collection);
        });
        db.close();
    })
    response.send('Connected - see console for a list of available collections');
  });
});
  1. 解决方案(在app init连接并将连接字符串分配给全局变量).但我认为将连接字符串指定给全局变量不是一个好主意.

    var mongodb;

我想在应用程序初始化时创建一个连接,并在整个应用程序生命周期内使用.

你们能帮帮我吗?谢谢

推荐答案

创建一个Connection个单例模块来管理应用程序数据库连接.

MongoClient不提供单例连接池,因此您不想在应用程序中重复拨打MongoClient.connect().包装mongo客户端的单例类适用于我见过的大多数应用程序.

const MongoClient = require('mongodb').MongoClient

class Connection {

    static async open() {
        if (this.db) return this.db
        this.db = await MongoClient.connect(this.url, this.options)
        return this.db
    }

}

Connection.db = null
Connection.url = 'mongodb://127.0.0.1:27017/test_db'
Connection.options = {
    bufferMaxEntries:   0,
    reconnectTries:     5000,
    useNewUrlParser:    true,
    useUnifiedTopology: true,
}

module.exports = { Connection }

无论你在哪里,Connection.open()方法都是可用的,如果Connection.db属性已经初始化,它也是可用的.

const router = require('express').Router()
const { Connection } = require('../lib/Connection.js')

// This should go in the app/server setup, and waited for.
Connection.open()

router.get('/files', async (req, res) => {
   try {
     const files = await Connection.db.collection('files').find({})
     res.json({ files })
   }
   catch (error) {
     res.status(500).json({ error })
   }
})

module.exports = router

Mongodb相关问答推荐

geoLocation或geoNear为坐标和半径使用let变量

在Mongoose中对嵌套文档设置时间戳,但不对父文档设置时间戳

如何在MongoSH中的现有文档中插入字段

在MongoDB集合中按文档内的频率对数组排序

获取响应周期中的特定键和值

在不知道字段名称的情况下如何引用 MongoDB 中的字段?

MongoDb $filter,然后获取非重复计数

用Golang减go mongodb中的两个字段

mongo.lock 文件有什么用?

Raft Vs MongoDB 初选

MongoDB:插入重复键更新

如何在 Mongo 聚合中合并文档中的数组字段

.save() 不是函数 Mongoose

什么是 Mongoose (Nodejs) 复数规则?

mongodb - 查找具有最接近整数值的文档

在 Mongoid 中,Date、Time、DateTime 和 TimeWithZone 字段类型有什么区别吗?

嵌套数组内的Mongodb增量值

MEAN 堆栈文件上传

MongoDB Compass timeouts超时

在mongoose中创建和查找地理位置