当前位置: 首页 > 知识库问答 >
问题:

节点。js和MongoDB,重用DB对象

丌官晨
2023-03-14

我对这两个节点都不熟悉。js和MongoDB,但我已经设法将SO和mongo的文档中的一些部分整合在一起。

Mongo documentetion给出了一个例子:

// Retrieve
var MongoClient = require('mongodb').MongoClient;

// Connect to the db
MongoClient.connect("mongodb://localhost:27017/exampleDb", function(err, db) {
  if(!err) {
    console.log("We are connected");
  }
});

如果我只需要在一个地方的一个函数中使用数据库,这看起来很好。在SO上搜索和阅读表明,我不应该每次都打开一个新连接,而是使用一个池并重用我第一次得到的数据库对象。这个答案在SO上很丰富,但我不确定如何首先获取DB对象,然后如何重用它。

假设我的App.js中有上面的Node.js代码,然后我有不同的路由需要在数据库上运行不同的操作,例如:

app.post('/employee', function(req, res){
    //Put req.name in database
});


app.post('/car', function(req, res){
    //Put req.car in database
});

我该如何把这两个片段组合成有用的东西呢?

我在Node中发现了一个类似的问题。js重用MongoDB引用,但从外观来看(http://mongodb.github.io/node-mongodb-native/driver-articles/mongoclient.html)看起来我应该使用MongoClient而不是db()。我也不确定它是否能解决我的问题。。。

共有2个答案

潘俊楚
2023-03-14

从上一段代码来看,您似乎在使用Express或类似的框架。您可以使用ExpressMongo db在req对象内部建立连接。此中间件将为您缓存连接,并将其与其他传入请求共享:

app.use(require('express-mongo-db')(require('mongodb'), { db: 'test' }))
app.post('/employee', function(req, res){
    // req.db.collection('names'),insert(req.name)
    // Put req.name in database
});


app.post('/car', function(req, res){
    // req.db.collection('names').insert(req.name)
    // Put req.car in database
});
孔正文
2023-03-14

您可以编写一个模块来初始化数据库连接,并使它们在整个程序中都可以访问。例如:

蒙戈。js

var mongodb = require('mongodb');

module.exports.init = function (callback) {
  var server = new mongodb.Server("127.0.0.1", 27017, {});
  new mongodb.Db('test', server, {w: 1}).open(function (error, client) {
    //export the client and maybe some collections as a shortcut
    module.exports.client = client;
    module.exports.myCollection = new mongodb.Collection(client, 'myCollection');
    callback(error);
  });
};

应用程序。js

var mongo = require('./mongo.js');

//setup express...

//initialize the db connection
mongo.init(function (error) {
    if (error)
        throw error;

    app.listen(80); //database is initialized, ready to listen for connections
});

随机ile.js

var mongo = require('./mongo.js');

module.exports.doInsert = function () {
  //use the collection object exported by mongo.js
  mongo.myCollection.insert({test: 'obj'}, {safe:true}, function(err, objects) {
    if (err)
        console.warn(err.message);
  });
};

我知道人们谈论池,但当我对池化mongo连接与所有请求的单个连接进行基准测试时,单个连接实际上表现得更好。诚然,这是大约一年前的事了,但我怀疑基本概念是否已经改变。所有的请求都是异步的,所以不需要多个连接才能同时发出请求。

至于MongoClient,我想这是他们鼓励的新语法。无论哪种方式,它本质上都是一个客户机对象,无论使用哪种样式,您都希望保留它并使其可访问。

 类似资料:
  • 问题内容: 以下代码使我在节点js中出现异常:“需要删除或更新” 由于我指定了更新操作,因此无法解决问题。 问题答案: 节点驱动程序中的语法与外壳程序中的语法不同,这是您使用的语法。 有一个单独的功能

  • 我有两个表有下面的模式,我想从用户表中获取用户名和密码,从信息表中获取全名。 var infoSchema=mongoose.Schema({khatam_id:String,user_id:String,fullname:String,}); var usersSchema=mongoose.Schema({user\u id:String,username:String,password:St

  • 我需要你的建议。 我想通过rest API(node.js)处理多个MongoDB数据库的服务器,并对它们进行管理。 如何管理我的数据库?当服务器启动不是一个好主意时,连接到所有数据库。连接数据库以在数据库中创建文档,然后断开连接听起来也不是个好主意。。。那我该怎么做呢?使用连接存储阵列,并在几分钟后断开连接?你怎么认为?

  • 我做了一个卑鄙的计划。这个项目几天前成功运行。但突然间,它给了我们一个错误。我不会改变任何事。我使用mongo atlas。下面给出了错误描述。 错误MongoNetworkError:无法在第一次连接时连接到服务器[cluster0-shard-00-01-s9niu.mongodb.net:27017][MongoNetworkError:连接5到cluster0-shard-00-01-s9

  • 我已经开始在一个简单的node.js应用程序中使用Q Promise包。所以我对如何在所有Promise序列完成后关闭数据库连接感兴趣。 例子: 我想在显示集合名称后关闭连接,但此匿名函数中没有db上下文。 有没有办法用promise模式处理此类案件?

  • 我创建了一个小节点应用程序,从GitHub jobs API获取作业。我正在使用模块来完成此操作。您可以看到下面的代码: 如果您能帮助打印JSON对象,我将不胜感激,目前它只打印。