当路由在单独的模块中时,如何使用 Node+Mongo 进行连接池? [复制]

Posted

技术标签:

【中文标题】当路由在单独的模块中时,如何使用 Node+Mongo 进行连接池? [复制]【英文标题】:How to do connection pooling with Node+Mongo when routes are in separate module? [duplicate] 【发布时间】:2016-04-20 04:47:55 【问题描述】:

Mongo 文档展示了在同一模块中定义 MongoClient 和服务器时如何设置连接池:

var express = require('express');
var mongodb = require('mongodb');
var app = express();

var MongoClient = require('mongodb').MongoClient;
var db;

// Initialize connection once
MongoClient.connect("mongodb://localhost:27017/integration_test", function(err, database) 
  if(err) throw err;

  db = database;

  // Start the application after the database connection is ready
  app.listen(3000);
  console.log("Listening on port 3000");
);

// Reuse database object in request handlers
app.get("/", function(req, res) 
  db.collection("replicaset_mongo_client_collection").find(, function(err, docs) 
    docs.each(function(err, doc) 
      if(doc) 
        console.log(doc);
      
      else 
        res.end();
      
    );
  );
);

如果您有一个设置服务器的app.js 和一个定义路由的api.js,这将如何工作?

【问题讨论】:

【参考方案1】:

一个简单的解决方案是在 app.js 中编写一些简单的中间件,通过请求变量将其传递给路由。

app.use(function(req, res, next) 
    req.db = db;
    next();
);

当然,您的所有路由都可以访问reqres,因此他们可以通过req.db 访问它。

【讨论】:

在这种情况下,我假设 MongoClient 连接应该在中间件之前定义? 这行得通,但不管你把它放在之前还是之后,因为传递给 app.use() 的中间件函数将在每次 HTTP 请求发生时重新执行,而不仅仅是应用程序启动时一次。因此,当任何 HTTP 请求发生并且中间件函数开始被调用时,db 将已被您帖子中的 db = database; 行分配。 @Josh1billion,谢谢老兄这对我很有帮助。 @VaibhavBisht 很高兴听到这个消息

以上是关于当路由在单独的模块中时,如何使用 Node+Mongo 进行连接池? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

当 /r/n 在文本中时,如何让 Notepad++ 显示单独的行?

MEAN Stack:当 Angular 在 Node 文件夹中时,如何从 Node 启动 Angular

当标识字段位于两个单独的列中时,如何检索该特定记录的最新出现? [关闭]

当代码在其他文件中时如何运行 Cron 作业 - Node JS

在 Angular 项目中,如何为项目单独创建路由文件?

Node.js 路由