我使用Node Mongo Native并试图设置一个全局连接变量,但我对两种可能的解决方案感到困惑。你们能帮我找出哪一个是好的吗?1.解决方案(这很糟糕,因为每个请求都会尝试创建新连接。)
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.listhtml" target="_blank">Collections({}).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');
});
});
解决方案(在app init连接并将连接字符串分配给全局变量)。但我认为将连接字符串指定给全局变量不是一个好主意。
var mongodb;var url='[connectionString]';MongoClient。connect(url,function(err,db){
assert.equal(null,err);mongodb=db;});
我想在应用程序初始化时创建一个连接,并在整个应用程序生命周期内使用。
你们能帮帮我吗?谢谢
我就是这样做的。
// custom class
const MongoClient = require('mongodb').MongoClient
const credentials = "mongodb://user:pass@mongo"
class MDBConnect {
static connect (db, collection) {
return MongoClient.connect(credentials)
.then( client => {
return client.db(db).collection(collection);
})
.catch( err => { console.log(err)});
}
static findOne(db, collection, query) {
return MDBConnect.connect(db,collection)
.then(c => {
return c.findOne(query)
.then(result => {
return result;
});
})
}
// create as many as you want
//static find(db, collection, query)
//static insert(db, collection, query)
// etc etc etc
}
module.exports = MDBConnect;
// in the route file
var express = require('express');
var router = express.Router();
var ObjectId = require('mongodb').ObjectId;
var MDBConnect = require('../storage/MDBConnect');
// Usages
router.get('/q/:id', function(req, res, next) {
let sceneId = req.params.id;
// user case 1
MDBConnect.connect('gameapp','scene')
.then(c => {
c.findOne({_id: ObjectId(sceneId)})
.then(result => {
console.log("result: ",result);
res.json(result);
})
});
// user case 2, with query
MDBConnect.findOne('gameapp','scene',{_id: ObjectId(sceneId)})
.then(result => {
res.json(result);
});
});
另一个更简单的方法是利用Express的内置功能在应用程序中的路线和模块之间共享数据。有一个叫做app的对象。当地人。我们可以将属性附加到它,并从我们的路线内部访问它。要使用它,请在应用程序中实例化mongo连接。js文件。
var app = express();
MongoClient.connect('mongodb://localhost:27017/')
.then(client =>{
const db = client.db('your-db');
const collection = db.collection('your-collection');
app.locals.collection = collection;
});
// view engine setup
app.set('views', path.join(__dirname, 'views'));
现在,您可以通过req在路由中访问该数据库连接,或者您希望在模块周围共享的任何其他数据。应用程序。本地人
如下所示,无需创建和要求额外的模块。
app.get('/', (req, res) => {
const collection = req.app.locals.collection;
collection.find({}).toArray()
.then(response => res.status(200).json(response))
.catch(error => console.error(error));
});
此方法可确保在应用期间打开数据库连接,除非您选择随时关闭它。req.app.locals.your-集合
可轻松访问该连接,并且不需要创建任何其他模块。
创建一个连接
单例模块来管理应用程序数据库连接。
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()
方法和连接将可用。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
问题内容: 我使用Node-Mongo-Native并尝试设置全局连接变量,但是我对两种可能的解决方案感到困惑。你们可以帮我选哪一个是好人吗?1.解决方案(这很糟糕,因为每个请求都将尝试创建新的连接。) 解决方案(在应用程序初始化时进行连接并将连接字符串分配给全局变量)。但我认为将连接字符串分配给全局变量不是一个好主意。 var mongodb; var url =’[connectionStri
问题内容: 我使用10gen的本机node.js驱动器将mongodb(2.2.2)与node.js一起使用。 起初一切顺利。但是当涉及到并发基准测试部分时,会发生很多错误。频繁进行1000次并发连接/关闭可能会导致mongodb拒绝任何进一步的请求,并出现以下错误: 另外,如果许多客户端在没有显式关闭的情况下关闭,则mongodb将花费几分钟的时间来检测并关闭它们。这也将导致类似的连接问题。(使
我试试看。js与mongodb(2.2.2)一起使用本机节点。js drive by 10gen。 起初一切都很顺利。但在并发基准测试部分,出现了很多错误。频繁连接/关闭1000次并发可能会导致mongodb拒绝任何进一步的请求,错误如下: 此外,如果很多客户端在没有显式关闭的情况下关闭,mongodb需要几分钟来检测并关闭它们。这也会导致类似的连接问题。(使用/var/log/mongodb/m
问题内容: 我有一个方法可以执行一些超时任务。我使用ExecutorServer.submit()获取Future对象,然后使用超时调用future.get()。这工作正常,但是我的问题是处理可能由我的任务引发的检查异常的最佳方法。以下代码可以正常工作,并保留检查的异常,但是如果方法签名中的检查的异常列表发生更改,则显得非常笨拙且容易中断。 对于如何解决这个问题,有任何的建议吗?我需要以Java
问题内容: 我有mongodb和NodeJs。通过mongoosejs完成连接。 开发Ajax Infinity滚动的最佳方法是什么?我应该使用极限和偏移量吗? 问题答案: 当您对数据集进行分页时,“跳过并限制”方法不是很有效。它实际上是Shlemiel Painter的算法 。 范围查询效率更高(当索引支持时)。例如,假设您正在显示推文。您的页面大小是20,您在第1000页上,并且想要加载第10
问题内容: 我已经阅读了一些有关如何将Mongo与Node结合使用的指南,它们似乎都以不同的方式连接到数据库。一种对我有效的特定方式是: 但是,这对我来说似乎效率低下/很奇怪,每当出现时,我就不得不重新连接到数据库,例如用于创建新用户或检索信息。 似乎更适合我的另一种方法是 我已经看到有几个网站可以按照这些方式进行操作,但是我个人无法满足上述要求。我一直在服务器端收到错误消息。因此,我的问题是,如