将 [=11g=] 数据库连接到 node.js 服务器
Connecting Mongodb databse to node.js server
我一直在尝试使用 node.js 和 express 制作一个网络应用程序,并决定使用 mongodb。
我正在使用 mongodb node.js 驱动程序版本:4.3.1
我已经尝试了所有可能的方法来连接 node.js 服务器和我的 mongodb atlas 数据库。
我的数据库也使用 db.js 文件中的以下代码连接:
const app = require('./app');
const MongoClient = require('mongodb').MongoClient
const Url = 'mongodb+srv://todoAppUser:<myOriginalPasswordHere>@cluster0.6lvjr.mongodb.net/myDatabase?retryWrites=true&w=majority';
MongoClient.connect(Url, function (err, client) {
if (err) throw err;
var db = client.db('myDatabase');
db.collection('products').findOne({}, function (findErr, result) {
if (findErr) throw findErr;
console.log(result.name);
client.close();
});
});
上面的代码工作正常并给出了输出。
但是我想使用 MVC (Model-view-Controller) 框架,我需要为其导出连接。
我在上面的代码中做了如下改动:
MongoClient.connect(Url, function (err, client) {
if (err) throw err;
var db = client.db('myDatabase');
db.collection('products').findOne({}, function (findErr, result) {
if (findErr) throw findErr;
console.log(result.name);
module.exports = db
client.close();
});
});
更改后,当我尝试从我的任何其他文件访问我的连接 (const productCollection = require('./db').collection("product");
) 时,出现以下错误:
const productCollection = require('./db').collection("product");
^
TypeError: require(...).collection is not a function
at Object.<anonymous> (D:\Kush- Complete Data\exp-projects\nodeApp\productController.js:1:43)
at Module._compile (internal/modules/cjs/loader.js:1072:14)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:1101:10)
at Module.load (internal/modules/cjs/loader.js:937:32)
at Function.Module._load (internal/modules/cjs/loader.js:778:12)
at Module.require (internal/modules/cjs/loader.js:961:19)
at require (internal/modules/cjs/helpers.js:92:18)
at Object.<anonymous> (D:\Kush- Complete Data\exp-projects\nodeApp\router.js:3:27)
at Module._compile (internal/modules/cjs/loader.js:1072:14)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:1101:10)
[nodemon] app crashed - waiting for file changes before starting...
请哪位大侠指点指点。
谢谢,
库什
这行不通,因为模块是同步求值的。您的回调是异步调用的,但此时您的模块已被评估。意味着 module.exports
没有效果并且 require('./db').collection()
没有定义。详情请见Node.js Modules。
要解决您的问题,请处理存储在模块内部变量中的连接并导出 getter 而不是连接变量本身。
// db.js
let client;
let db;
function connectDB(url, dbName) {
client = new MongoClient(url);
return new Promise(function(resolve, reject) {
client.connect(function(err) {
if(err) return reject(err);
db = client.db(dbName);
return resolve(db);
});
});
}
function getCurrentDB() {
return db;
}
module.exports.connectDB = connectDB;
module.exports.getCurrentDB = getCurrentDB;
然后在其他文件中重复使用您打开的连接,如下所示:
// other.js
const db = require("./db.js");
db.getCurrentDB().collection("product");
当然,如果预先通过connectDB()
建立了连接,getCurrentDB()
只能return一个数据库连接。所以你必须等待 Promise.
的决议
[已解决]
我发现,在 mongodb 的较新版本中,他们基本上改变了将节点服务器连接到数据库的方式。
为了建立可重复使用的连接(以便我们可以从任何其他文件访问连接的数据库),我在我的 db.js
文件中创建了一个异步函数,其中建立了连接,然后将其导出。在文件的末尾,我调用了函数。
代码如下:
const {MongoClient} = require('mongodb')
const client = new MongoClient('mongodb+srv://todoAppUser:<password>@cluster0.6lvjr.mongodb.net/myDatabase?retryWrites=true&w=majority')
async function start(){
await client.connect()
console.log("Connected")
module.exports = client.db()
const app = require('./app')
app.listen(3000)
}
start()
并且从另一个文件调用它时:
const productCollection = require('./db').collection("product");
这段代码没有任何错误,而且工作得很好。
借助上面的代码,在遵循MVC(Model-View-Controller)框架的同时也可以方便的使用。
我一直在尝试使用 node.js 和 express 制作一个网络应用程序,并决定使用 mongodb。 我正在使用 mongodb node.js 驱动程序版本:4.3.1 我已经尝试了所有可能的方法来连接 node.js 服务器和我的 mongodb atlas 数据库。
我的数据库也使用 db.js 文件中的以下代码连接:
const app = require('./app');
const MongoClient = require('mongodb').MongoClient
const Url = 'mongodb+srv://todoAppUser:<myOriginalPasswordHere>@cluster0.6lvjr.mongodb.net/myDatabase?retryWrites=true&w=majority';
MongoClient.connect(Url, function (err, client) {
if (err) throw err;
var db = client.db('myDatabase');
db.collection('products').findOne({}, function (findErr, result) {
if (findErr) throw findErr;
console.log(result.name);
client.close();
});
});
上面的代码工作正常并给出了输出。 但是我想使用 MVC (Model-view-Controller) 框架,我需要为其导出连接。
我在上面的代码中做了如下改动:
MongoClient.connect(Url, function (err, client) {
if (err) throw err;
var db = client.db('myDatabase');
db.collection('products').findOne({}, function (findErr, result) {
if (findErr) throw findErr;
console.log(result.name);
module.exports = db
client.close();
});
});
更改后,当我尝试从我的任何其他文件访问我的连接 (const productCollection = require('./db').collection("product");
) 时,出现以下错误:
const productCollection = require('./db').collection("product");
^
TypeError: require(...).collection is not a function
at Object.<anonymous> (D:\Kush- Complete Data\exp-projects\nodeApp\productController.js:1:43)
at Module._compile (internal/modules/cjs/loader.js:1072:14)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:1101:10)
at Module.load (internal/modules/cjs/loader.js:937:32)
at Function.Module._load (internal/modules/cjs/loader.js:778:12)
at Module.require (internal/modules/cjs/loader.js:961:19)
at require (internal/modules/cjs/helpers.js:92:18)
at Object.<anonymous> (D:\Kush- Complete Data\exp-projects\nodeApp\router.js:3:27)
at Module._compile (internal/modules/cjs/loader.js:1072:14)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:1101:10)
[nodemon] app crashed - waiting for file changes before starting...
请哪位大侠指点指点。
谢谢, 库什
这行不通,因为模块是同步求值的。您的回调是异步调用的,但此时您的模块已被评估。意味着 module.exports
没有效果并且 require('./db').collection()
没有定义。详情请见Node.js Modules。
要解决您的问题,请处理存储在模块内部变量中的连接并导出 getter 而不是连接变量本身。
// db.js
let client;
let db;
function connectDB(url, dbName) {
client = new MongoClient(url);
return new Promise(function(resolve, reject) {
client.connect(function(err) {
if(err) return reject(err);
db = client.db(dbName);
return resolve(db);
});
});
}
function getCurrentDB() {
return db;
}
module.exports.connectDB = connectDB;
module.exports.getCurrentDB = getCurrentDB;
然后在其他文件中重复使用您打开的连接,如下所示:
// other.js
const db = require("./db.js");
db.getCurrentDB().collection("product");
当然,如果预先通过connectDB()
建立了连接,getCurrentDB()
只能return一个数据库连接。所以你必须等待 Promise.
[已解决]
我发现,在 mongodb 的较新版本中,他们基本上改变了将节点服务器连接到数据库的方式。
为了建立可重复使用的连接(以便我们可以从任何其他文件访问连接的数据库),我在我的 db.js
文件中创建了一个异步函数,其中建立了连接,然后将其导出。在文件的末尾,我调用了函数。
代码如下:
const {MongoClient} = require('mongodb')
const client = new MongoClient('mongodb+srv://todoAppUser:<password>@cluster0.6lvjr.mongodb.net/myDatabase?retryWrites=true&w=majority')
async function start(){
await client.connect()
console.log("Connected")
module.exports = client.db()
const app = require('./app')
app.listen(3000)
}
start()
并且从另一个文件调用它时:
const productCollection = require('./db').collection("product");
这段代码没有任何错误,而且工作得很好。 借助上面的代码,在遵循MVC(Model-View-Controller)框架的同时也可以方便的使用。