Node.js 上 MongoDB 连接的最佳实践是啥?

     2023-03-04     142

关键词:

【中文标题】Node.js 上 MongoDB 连接的最佳实践是啥?【英文标题】:What's the best practice for MongoDB connections on Node.js?Node.js 上 MongoDB 连接的最佳实践是什么? 【发布时间】:2012-08-01 18:02:48 【问题描述】:

这对我来说有点不清楚(我刚刚开始使用 Node 和 Mongo),并且由于服务器性能和压力(我想这是另一个问题,但我会得到到文章末尾)。

所以,假设我正在使用 Node.js 和 Restify 编写 API,其中每个 API 端点对应一个函数,我应该:

a) 打开数据库连接并将其存储在全局变量中,然后在每个函数中使用它? 示例:

// requires and so on leave me with a db var, assume auto_reconnect: true
function openDB() 
    db.open(function(err, db) 
        // skip err handling and so on
        return db;
    


var myOpenDB = openDB(); // use myOpenDB in every other function I have

b) 打开数据库连接,然后把所有东西都放在一个巨大的闭包中? 示例:

// same as above
db.open(function(err, db) 
    // do everything else here, for example:
    server.get('/api/dosomething', function doSomething(req, res, next)  // (server is an instance of a Restify server)
        // use the db object here and so on
    );

c) 每次需要时打开和关闭数据库? 示例:

// again, same as above
server.get('/api/something', function doSomething(req, res, next) 
    db.open(function(err, db) 
        // do something
        db.close();
    );
);

server.post('/api/somethingelse', function doSomethingElse(req, res, next) 
    db.open(function(err, db) 
        // do something else
        db.close();
    );
);

最后一个是我凭直觉会做的,但同时我也觉得这样做不太舒服。它不会对 Mongo 服务器造成太大压力吗?尤其是当(我希望我确实做到了)它会收到数百(如果不是数千)这样的电话吗?

提前谢谢你。

【问题讨论】:

此问题与***.com/q/10656574有关 【参考方案1】:

我非常喜欢MongoJS。它允许您以与默认命令行非常相似的方式使用 Mongo,它只是官方 Mongo 驱动程序的包装。您只需打开数据库一次并指定您将使用的集合。如果您使用 --harmony-proxies 运行 Node,您甚至可以省略集合。

var db = require('mongojs').connect('mydb', ['posts']);

server.get('/posts', function (req, res) 
  db.posts.find(function (err, posts) 
    res.send(JSON.stringify(posts));
  );
);

【讨论】:

我真的很喜欢它! :D 非常感谢。但是,就像我在回答的 cmets 中对 Gijs 所说的那样,我在某处读到,在同一连接下执行所有操作都会导致代码阻塞。你知道这是不是真的吗? 我不这么认为。它会破坏目的。我相信与数据库的连接是通过套接字完成的。套接字通过网络执行的操作与 Node 在使用 Streams 读取文件时执行的操作非常相似。 ReadStream 以小块的形式读取文件并在接收到它们时触发事件。我认为套接字对网络块也是如此。见nodejs.org/api/net.html#net_class_net_socket 阻塞或非阻塞取决于 API。所以上面的例子看起来像是阻塞的,因为 server.get(...) 在你成功连接到数据库之前不会被执行(这纯粹是它的样子;我不熟悉 MongoJS)。但是,鉴于您可能需要数据库来执行任何事情,这并不一定那么糟糕,尽管如果您有许多需要很长时间才能执行的依赖项,那么最好使用具有期货/承诺/回调的解决方案,例如 @scttnlsn 的解决方案。 请注意,MongoJS 的实际查询实现似乎是异步的,从我从 github 页面可以看出,因为它们都采用回调参数,所以那里不应该有任何问题。【参考方案2】: 选项 A 不是一个好主意,因为无法保证在处理 HTTP 请求之前数据库将完成打开(当然这不太可能) 选项 C 也不理想,因为它不必要地打开和关闭数据库连接

我喜欢处理这个问题的方式是使用延迟/承诺。 Node 有很多不同的 Promise 库,但基本的想法是做这样的事情:

var promise = new Promise();

db.open(function(err, db) 
    // handle err
    promise.resolve(db);
);

server.get('/api/something', function doSomething(req, res, next) 
    promise.then(function(db)
        // do something
    );
);

我相信 Mongoose 处理连接的方式与此类似。

【讨论】:

谢谢。我调查了 Mongoose,显然它与官方驱动程序并没有太大的不同。它只是在完成打开连接时触发一个事件,当它未连接时它会缓冲操作,因此您不必担心它。不过,我会研究一下承诺的事情:) 下面介绍的 MongoJS 库实际上是使用 Promise 的一个更好的例子(虽然它们被称为期货)。

最佳实践 beanstalkd (queue) 和 node.js

...功,我想做同样的工作10次。那么,最佳实践是什么,在mongodb中使用jobId存储错误和成功计数,或者删除并在正文 查看详情

连接 MongoDB 的最佳实践 [重复]

】连接MongoDB的最佳实践[重复]【英文标题】:BestpracticeforjoinsMongoDB[duplicate]【发布时间】:2016-11-3018:06:11【问题描述】:我正在构建一个基本上允许用户管理在线通讯录的应用程序。我是一名SQL专家,习惯于规范化我的Db。我正... 查看详情

Heroku 最佳实践时钟与 node.js

】Heroku最佳实践时钟与node.js【英文标题】:Herokubestpracticeclockswithnode.js【发布时间】:2013-07-2808:50:25【问题描述】:我想知道在Heroku上设置时钟进程的最佳方法是什么。我的应用完全在Node中构建,我计划使用node-schedule来指定我... 查看详情

.NET MongoDB 连接的最佳实践?

】.NETMongoDB连接的最佳实践?【英文标题】:.NETbestpracticesforMongoDBconnections?【发布时间】:2011-01-1217:40:48【问题描述】:我最近一直在使用GitHub上的C#驱动程序玩MongoDB(速度非常快)。在我正在测试的小型单线程控制台应用程序... 查看详情

使用 Node.js 构建网站的最佳实践

】使用Node.js构建网站的最佳实践【英文标题】:BestpracticesofbuildingawebsiteusingNode.js【发布时间】:2012-07-0322:18:55【问题描述】:我想知道如何使用Node.js从头开始​​开发网站。我了解我如何可能做到这一点,但我对最佳设计实践... 查看详情

使用 Node.js 构建网站的最佳实践

】使用Node.js构建网站的最佳实践【英文标题】:BestpracticesofbuildingawebsiteusingNode.js【发布时间】:2012-07-0322:18:55【问题描述】:我想知道如何使用Node.js从头开始​​开发网站。我了解我如何可能做到这一点,但我对最佳设计实践... 查看详情

使用 Node.js 连接到 MongoDB 的最佳方式 [重复]

】使用Node.js连接到MongoDB的最佳方式[重复]【英文标题】:BestwaytoconnecttoMongoDBusingNode.js[duplicate]【发布时间】:2016-11-2322:40:40【问题描述】:我已经阅读了一些关于如何将Mongo与Node一起使用的指南,它们似乎都以不同的方式连接... 查看详情

为在 node.js 应用程序上运行的 mongodb 计算 n 个连接池所需的内存

】为在node.js应用程序上运行的mongodb计算n个连接池所需的内存【英文标题】:Calculatingneededmemoryfornconnectionpoolsformongodbrunningonnode.jsapp【发布时间】:2016-01-2605:55:50【问题描述】:我正在尝试分析运行mongodb的node.js应用程序的性能... 查看详情

使用 SQLite3 + Node.js 的最佳实践

】使用SQLite3+Node.js的最佳实践【英文标题】:BestpracticesforusingSQLite3+Node.js【发布时间】:2013-09-2420:12:11【问题描述】:我有一个适度的Node.js脚本,它通过API从Wikipedia中提取数据并将其存储在SQLite数据库中。我正在使用这个node-sql... 查看详情

typescript node.js express 路由分隔文件的最佳实践

】typescriptnode.jsexpress路由分隔文件的最佳实践【英文标题】:typescriptnode.jsexpressroutesseparatedfilesbestpractices【发布时间】:2016-09-0703:32:58【问题描述】:在Node项目中使用Express和Typescript什么是express.Router的“最佳实践”。示例目录... 查看详情

如何在 node.js 和 mongoDB 本机驱动程序上启用调试?

】如何在node.js和mongoDB本机驱动程序上启用调试?【英文标题】:howtoenabledebugonnode.jsandmongoDBnativedriver?【发布时间】:2012-09-2310:15:37【问题描述】:我使用带有连接池的node.js和node-mongodb-native驱动程序。有没有办法启用调试以查... 查看详情

使用 express.js 在 node.js 中提供 html 的最佳实践是啥?

】使用express.js在node.js中提供html的最佳实践是啥?【英文标题】:Whatisthebestpracticeforservinghtmlinnode.jswithexpress.js?使用express.js在node.js中提供html的最佳实践是什么?【发布时间】:2013-05-1117:10:06【问题描述】:我目前正在我的app.js/... 查看详情

Node.js 和 MongoDB:保存集合还是每次都抓取它们?

】Node.js和MongoDB:保存集合还是每次都抓取它们?【英文标题】:Node.js&MongoDB:Keepingcollectionsorgrabbingthemeachtime?【发布时间】:2013-10-1611:47:21【问题描述】:最佳实践/优化问题:当处理在我的MongoDB中使用几个不同集合的请求时... 查看详情

node.js 中所需的结构化库的最佳实践

】node.js中所需的结构化库的最佳实践【英文标题】:Bestpracticeforstructuringlibrariestoberequiredinnode.js【发布时间】:2013-07-2923:30:34【问题描述】:我有几个包含辅助函数的实用程序库,我想加载它们以便可以从控制器中使用它们,我... 查看详情

Node.js 最佳实践异常处理——在 Async/Await 之后

】Node.js最佳实践异常处理——在Async/Await之后【英文标题】:Node.jsBestPracticeExceptionHandling-AfterAsync/Await【发布时间】:2017-01-3123:25:02【问题描述】:他们已经是关于这个话题的问题了Node.jsBestPracticeExceptionHandling这是旧的,答案非... 查看详情

Android Socket.IO 保持连接活跃的最佳实践

】AndroidSocket.IO保持连接活跃的最佳实践【英文标题】:AndroidSocket.IObestpracticesforkeepingconnectionalive【发布时间】:2014-06-0713:05:38【问题描述】:我的Android应用程序正在使用AndroidAsync库通过Socket.IO客户端连接到Node.js服务器。套接字... 查看详情

构建 Node.js 和 Socket.io 应用程序的最佳实践?

】构建Node.js和Socket.io应用程序的最佳实践?【英文标题】:BestpracticesinstructuringNode.js&Socket.ioapp?【发布时间】:2020-11-1405:48:13【问题描述】:目前我正在开发一个使用websockets进行通信的节点服务器。我习惯于在我的应用程序... 查看详情

确定我的 Node.js 应用程序当前在哪个 AWS Beanstalk 环境中运行的最佳实践是啥?

...定我的Node.js应用程序当前在哪个AWSBeanstalk环境中运行的最佳实践是啥?【英文标题】:WhatisthebestpracticeforfiguringoutinwhichAWSBeanstalkEnvironmentmyNode.jsapplicationiscurrentlyrunning?确定我的Node.js应用程序当前在哪个AWSBeanstalk环境中运行的最... 查看详情