簡體   English   中英

在 Node.js/Express 的中間件函數中使 MongoDB Atlas 連接可用的正確方法是什么?

[英]What is the correct way to make MongoDB Atlas connection available in middleware functions in Node.js/Express?

環境

Node.js( 18 LTS )/快遞( ^4.18.2
MongoDB 本機驅動程序 ( ^4.12.0 )
MongoDB 圖集 ( 5.0.14 )

申請結構

.github  
config  
 - mongodb_client.js  
dist  
middleware  
node_modules  
routes  
src
views
.env  
.gitignore
app.js  
package.json  
README.md  

連接代碼

作為完整性檢查,這是 MongoDB Atlas 接口中提供的連接代碼:

作為截圖:
在此處輸入圖像描述

作為代碼:

const { MongoClient, ServerApiVersion } = require('mongodb');

const uri = "mongodb+srv://admin:<password>@cluster0.******.mongodb.net/?retryWrites=true&w=majority";

const client = new MongoClient(uri, { useNewUrlParser: true, useUnifiedTopology: true, serverApi: ServerApiVersion.v1 });

client.connect(err => {
  const collection = client.db("test").collection("devices");
  // perform actions on the collection object
  client.close();
});

期望的行為

MongoDB Atlas 接口中提供的代碼片段在一個文件中執行連接和后續數據庫調用。

但是,我想:

  • 創建一個包含 MongoDB Atlas 連接的文件(例如mongodb_client.js
  • 導出連接,以便它可以在中間件文件中使用(例如my_middleware_01.js

所以,在偽代碼中,我想它看起來像這樣:

配置/mongodb_client.js

import { MongoClient, ServerApiVersion } from 'mongodb'; 

const connection_string = process.env.MONGODB_CONNECTION_STRING;

const mongodb_client = new MongoClient(connection_string, { useNewUrlParser: true, useUnifiedTopology: true, serverApi: ServerApiVersion.v1 });

// export the connection somehow   
export { mongodb_client };

中間件 / my_middleware_01.js

import { mongodb_client } from '../config/mongodb_client.js';

const api_myResource_get = async (req, res) => {
    mongodb_client.open();
    let collection = mongodb_client.db('myDatabase').collection('myCollection');
    let result = await collection.findOne(query, options);  
    res.json({ result: result });
    mongodb_client.close();  
}; 

export { api_myResource_get };

我試過的

似乎我一年多前就在努力應對這種動態,並在此處發布了我的解決方案:

https://stackoverflow.com/a/70135909

然而,我認為慣例已經從那時起發生了變化。

例如在實例化客戶端時,當前方法似乎是:

const client = new MongoClient(connection_string, { useNewUrlParser: true, useUnifiedTopology: true, serverApi: ServerApiVersion.v1 });

而以前它是這樣的:

await MongoClient.connect(connection_string);

我谷歌搜索過:

如何使 mongodb 連接在 node.js 中間件中可用?

但是所有的結果似乎都引用了這個舊的約定,我想確保我使用的是最佳實踐(以及最新的約定)。

相關問題和資源

將 Mongo DB Object DB 傳遞給 Express 中間件

在 NodeJs 中處理 Mongodb 全局連接的最佳方法是什么

如何在 Node.js web 應用程序中管理 MongoDB 連接?

MongoClient和我們在MongoClient.connect()方法回調中得到的客戶端object有什么區別

如何跨 NodeJs 應用程序和模塊正確重用到 Mongodb 的連接

MongoDB 驅動程序連接文檔

編輯 01:

以下是返回錯誤的一次嘗試:

類型錯誤:無法讀取 null 的屬性(讀取“db”)

配置/mongodb_connection.js

import { MongoClient, ServerApiVersion } from 'mongodb'; 

const connection_string = process.env.MONGODB_CONNECTION_STRING;

class mongodb_connection {
  static async open() {
    if (this.conn) return this.conn;
    this.conn = await MongoClient.connect(connection_string, { useNewUrlParser: true, useUnifiedTopology: true, serverApi: ServerApiVersion.v1 });
    return this.conn;
  }
}

mongodb_connection.conn = null;
mongodb_connection.url = connection_string;

export { mongodb_connection };

中間件 / api_mongodb_get.js

import { mongodb_connection } from '../../config/mongodb_connection.js';

const api_mongodb_get = async (req, res) => {

    try {
        mongodb_connection.open();
        const collection = mongodb_connection.conn.db('pages').collection('pages');
        const result = await collection.findOne({ "my_key": "my value" }); 

        res.json({ data: result });
        mongodb_connection.close();
    } catch (error) {
        console.error(error);
        res.status(500).send(error);
    }

};

export { api_mongodb_get };

編輯 02:

以下“有效”但我不知道這是否是最佳做法。

換句話說,我不知道我是否忽略了會導致不良行為的事情。

配置/mongodb_connection.js

import { MongoClient, ServerApiVersion } from 'mongodb'; 

const connection_string = process.env.MONGODB_CONNECTION_STRING;

const mongodb_connection = new MongoClient(connection_string, { useNewUrlParser: true, useUnifiedTopology: true, serverApi: ServerApiVersion.v1 });

export { mongodb_connection };

中間件 / api_mongodb_get.js

import { mongodb_connection } from '../../config/mongodb_connection.js';

const api_mongodb_get = async (req, res) => {

    try {
            mongodb_connection.connect(async err => {  

                const collection = mongodb_connection.db('pages').collection('pages');
                const result = await collection.findOne({ "my_key": "my value" }); 

                res.json({ data: result });
                
                mongodb_connection.close();
            });
    } catch (error) {
        console.error(error);
        res.status(500).send(error);
    }

};

export { api_mongodb_get };

在使用mongodb的基礎上,使用mongoose庫建立連接。 下面是與 mongodb 集群建立連接的例子:

connectDb.js:


const dotenv = require('dotenv').config();
const DB_URL = process.env.DB_URL;
const mongoose = require('mongoose');

const connectDb = async () => {
    try {
        const connection = await mongoose.connect(DB_URL)
        console.log(`Connected to database Successfully: ${connection}`)
    } catch (error) {
        console.log(error)
    }
}
module.exports = connectDb;

我想我不需要提到 DB_URL 是由 mondodb 集群提供的 URL。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM