如何使用connection.db.collection函数?
how to use the connection.db.collection function?
我从这个 link 中实现了以下代码:
为 MongoDB 的连接创建一个 class。但是当我尝试在路由器中调用单例 class 时,出现以下错误:
TypeError: Connection.db.collection 不是函数
mongodb.js
const MongoClient = require('mongodb').MongoClient
const url = '...';
class Connection {
static connectToDB() {
if ( this.database ) return Promise.resolve(this.database)
return MongoClient.connect(this.url, {useNewUrlParser: true}, (err, db) => {
if (err) console.log(err);
else {
this.db = db;
console.log('MongoDB connected');
}
})
}
}
Connection.db = null
Connection.url = url
Connection.options = {
bufferMaxEntries: 0,
reconnectTries: 5000,
}
module.exports = Connection;
app.js
const express = require('express');
const app = express();
let bodyParser = require('body-parser')
// mongodb config
const Connection = require('../config/mongodb');
const server = app.listen(3000, () => {
Connection.connectToDB(); // output: MongoDB connected
console.log(`listening to port: ${port} on http://127.0.0.1:3000}/`); // output: listening to port: 3000 on http://127.0.0.1:3000/
});
router.js
const router = require('express').Router();
let Connection = require('../config/mongodb');
router.post('/data', (req, res) => {
Connection.db.collection('tweets').find({}) // output: TypeError: Connection.db.collection is not a function
.then(tweets => console.log(tweets))
.catch(err => console.log(err));
});
您链接的问题始终使用 promises,而您使用的是 connect 的回调版本。
return MongoClient.connect(this.url, {useNewUrlParser: true}, (err, db) => ...
然后您调用它而不在您的服务器中返回:
Connection.connectToDB();
console.log(`listening to port: ${port} on http://127.0.0.1:3000}/`);
因此,无法保证在您的第一个 api 请求到达时您的连接已经建立。事实上,如果您这样做了:
Connection.connectToDB();
console.log(`listening to port: ${port} on http://127.0.0.1:3000}/`);
Connection.db.collection('tweets').find({});
每次都会失败,因为 Connection.db 仍然是 null。
在您链接的示例中,使用 Promises 可以防止这种情况发生。特别注意connect方法:
static connectToDB() {
if ( this.database ) return Promise.resolve(this.database)
// ** USING THE PROMISE VERSION OF CONNECT **
return MongoClient.connect(this.url, this.options)
.then(db => this.db = db)
}
并且您的使用代码也应该使用 promises:
return Connection.connectToDB()
.then(() => {
// do something here
});
尝试一次 package.json,将 mongodb 行更改为 "mongodb":“^2.2.33”。您将需要 npm uninstall mongodb;然后 npm install 安装这个版本。
我从这个 link 中实现了以下代码:
为 MongoDB 的连接创建一个 class。但是当我尝试在路由器中调用单例 class 时,出现以下错误:
TypeError: Connection.db.collection 不是函数
mongodb.js
const MongoClient = require('mongodb').MongoClient
const url = '...';
class Connection {
static connectToDB() {
if ( this.database ) return Promise.resolve(this.database)
return MongoClient.connect(this.url, {useNewUrlParser: true}, (err, db) => {
if (err) console.log(err);
else {
this.db = db;
console.log('MongoDB connected');
}
})
}
}
Connection.db = null
Connection.url = url
Connection.options = {
bufferMaxEntries: 0,
reconnectTries: 5000,
}
module.exports = Connection;
app.js
const express = require('express');
const app = express();
let bodyParser = require('body-parser')
// mongodb config
const Connection = require('../config/mongodb');
const server = app.listen(3000, () => {
Connection.connectToDB(); // output: MongoDB connected
console.log(`listening to port: ${port} on http://127.0.0.1:3000}/`); // output: listening to port: 3000 on http://127.0.0.1:3000/
});
router.js
const router = require('express').Router();
let Connection = require('../config/mongodb');
router.post('/data', (req, res) => {
Connection.db.collection('tweets').find({}) // output: TypeError: Connection.db.collection is not a function
.then(tweets => console.log(tweets))
.catch(err => console.log(err));
});
您链接的问题始终使用 promises,而您使用的是 connect 的回调版本。
return MongoClient.connect(this.url, {useNewUrlParser: true}, (err, db) => ...
然后您调用它而不在您的服务器中返回:
Connection.connectToDB();
console.log(`listening to port: ${port} on http://127.0.0.1:3000}/`);
因此,无法保证在您的第一个 api 请求到达时您的连接已经建立。事实上,如果您这样做了:
Connection.connectToDB();
console.log(`listening to port: ${port} on http://127.0.0.1:3000}/`);
Connection.db.collection('tweets').find({});
每次都会失败,因为 Connection.db 仍然是 null。
在您链接的示例中,使用 Promises 可以防止这种情况发生。特别注意connect方法:
static connectToDB() {
if ( this.database ) return Promise.resolve(this.database)
// ** USING THE PROMISE VERSION OF CONNECT **
return MongoClient.connect(this.url, this.options)
.then(db => this.db = db)
}
并且您的使用代码也应该使用 promises:
return Connection.connectToDB()
.then(() => {
// do something here
});
尝试一次 package.json,将 mongodb 行更改为 "mongodb":“^2.2.33”。您将需要 npm uninstall mongodb;然后 npm install 安装这个版本。