[英]Failed to connect node.js app to MongoDB Atlas despite using the correct connection credentials
[英]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_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 的連接
編輯 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.