首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >连接到Mongodb- express.js中的本机驱动程序

连接到Mongodb- express.js中的本机驱动程序
EN

Stack Overflow用户
提问于 2013-08-04 06:39:47
回答 3查看 7.3K关注 0票数 15

我在express.js应用程序中使用mongodb-本机驱动程序。我在数据库中有大约6个集合,所以我创建了6个js文件,每个文件都有一个作为javascript对象(例如function collection(){})的集合,以及处理这些集合上所有操作的原型函数。我觉得这是个很好的建筑。

但是我遇到的问题是如何连接到数据库?我应该在每个文件中创建一个连接并使用它们吗?,我认为这将是过度的,因为mongodb中的连接本机驱动程序创建了一个连接池,其中有几个是不合理的。

,那么我如何创建一个连接池,并在所有的collections.js文件中使用它呢?,我想让连接像它在猫鼬中实现的那样。让我知道,如果我的思维过程在架构的应用程序是错误的。

使用Mongoose可以解决这些问题,但是我在几个地方读过,它比本地驱动程序慢,而且我更喜欢没有模式的模型。

编辑:我用模型创建了一个模块。每个集合都在一个文件中,它将数据库作为参数。现在,在index.js文件中,我调用了数据库连接,并在从连接中获得数据库后保留了一个变量db。(我使用了自动重新连接功能,以确保连接没有丢失)。在同一个index.js文件中,我导出了如下所示的每个集合

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
exports.model1 = require('./model1').(db)
exprorts.model2 = require('./model2').(db)

这确保了数据库部分仅在一个模块中处理,应用程序只调用每个model.js文件导出的函数,如save()fincdbyid()等(whatever you do in the function is upto you to implement)。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-08-04 13:39:13

如何连接到数据库?

为了使用MongoDB本机驱动程序进行连接,需要执行以下操作:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var util = require('util');
var mongodb = require('mongodb');
var client = mongodb.MongoClient;

var auth = {
    user: 'username',
    pass: 'password',
    host: 'hostname',
    port: 1337,
    name: 'databaseName'
};

var uri = util.format('mongodb://%s:%s@%s:%d/%s',
    auth.user, auth.pass, auth.host, auth.port, auth.name);

/** Connect to the Mongo database at the URI using the client */
client.connect(uri, { auto_reconnect: true }, function (err, database) {
    if (err) throw err;
    else if (!database) console.log('Unknown error connecting to database');
    else {

        console.log('Connected to MongoDB database server at:');
        console.log('\n\t%s\n', uri);

        // Create or access collections, etc here using the database object
    }
});

一个基本的连接是这样设置的。这就是我所能给你的只是你想要的东西的基本描述。张贴一些代码,您到目前为止,以获得更具体的帮助。

我应该在每个文件中创建一个连接并使用它们吗?

不是的。

,那么我如何创建一个连接池并在所有的collections.js文件中使用它呢?

您可以使用上面的代码创建一个文件,让我们称它为dbmanager.js连接到数据库。在数据库上运行的导出函数(如createUserdeleteUser等),然后导出功能如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
module.exports = {
    createUser: function () { ; },
    deleteUser: function () { ; }
};

然后,您可以从另一个文件进行require,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var dbman = require('./dbmanager');

dbman.createUser(userData); // using connection established in `dbmanager.js`

编辑:,因为我们处理的是JavaScript和单个线程,本机驱动程序实际上会自动为您处理连接池。您可以在下面的StackOverflow链接中查找这一点,以获得更多的确认。“任择议定书”也在问题中说明了这一点。这意味着client.connect只应该被服务器的一个实例调用一次。在成功地从对database的调用中检索到client.connect对象之后,应该在应用程序的整个实例中重用该database对象。这很容易通过使用Node.JS提供的模块模式来实现。

我的建议是创建一个或多个模块集,作为与数据库交互的单一接触点。在我的应用程序中,我通常有一个依赖于本地驱动程序的模块,即调用require('mongodb')。我的应用程序中的所有其他模块都不会直接访问数据库,而是所有操作都必须由这个数据库模块协调。

这将处理本机驱动程序的所有代码封装到一个或多个模块中。OP似乎认为我发布的简单代码示例存在问题,在我的示例中描述了“单个大闭包”的问题。这都是非常基本的东西,所以我在这里添加对基本架构的澄清,但我仍然不觉得有必要修改任何代码。

OP似乎还认为在这里可以建立多个连接。这种设置是不可能的。如果像我前面建议的那样创建了一个模块,那么第一次调用require('./dbmanager')时,它将执行文件dbmanager.js中的代码并返回module.exports对象。导出对象被缓存,并在每次调用require('./dbmanager')时返回,但是,dbmanager.js中的代码将只执行第一个require

如果您不想创建这样的模块,那么另一种选择是只导出传递给client.connect回调的client.connect,并在整个应用程序的不同位置直接使用它。然而,我建议不要这样做,不管OPs有什么顾虑。

类似的、可能重复的堆栈溢出问题,除其他外:

票数 18
EN

Stack Overflow用户

发布于 2014-08-08 10:43:00

正如公认的答案所述-您应该只为所有传入请求创建一个连接并重用它,但是答案是缺少的解决方案,这将创建和缓存连接。我编写了快速中间件来实现这一目标-- 特快专递。乍一看,这个任务是微不足道的,大多数人使用这种代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var db;
function createConnection(req, res, next) {
    if (db) { req.db = db; next(); }
    client.connect(uri, { auto_reconnect: true }, function (err, database) {
        req.db = db = databse;
        next();
    });
}

app.use(createConnection);

但是,当多个请求同时到达时,当db未定义时,此代码将导致连接泄漏。express-mongo-db通过保持传入客户端并只在需要模块时(而不是在第一个请求到达时)调用connect一次来解决这个问题。

希望你觉得有用。

票数 2
EN

Stack Overflow用户

发布于 2014-08-20 17:52:28

我只是想为其他感兴趣或有问题的人添加我自己的MongoDB连接方法

此方法假定您不需要身份验证(我在本地主机上使用此方法)

身份验证仍然容易实现。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var MongoClient = require('mongodb').MongoClient;
var Server      = require('mongodb').Server;

var client = new MongoClient(new Server('localhost',27017,{
                                socketOptions: {connectTimeoutMS: 500},
                                poolSize:5,
                                auto_reconnect:true
                            }, {
                                numberOfRetries:3,
                                retryMilliseconds: 500
                            }));

client.open(function(err, client) {
    if(err) {
        console.log("Connection Failed Via Client Object.");
    } else {
        var db = client.db("theDbName");
        if(db) {
            console.log("Connected Via Client Object . . .");
            db.logout(function(err,result) {
                if(!err) {
                    console.log("Logged out successfully");
                }
                client.close();
                console.log("Connection closed");
            });
        }
    }
});

归功于布拉德达维,他在他的 (第231-232页)中对这种方法进行了研究。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18044113

复制
相关文章
IOS 使用UIWebView加载网页
1 class ViewController:UIViewController, UIWebViewDelegate { 2 3 override func viewDidLoad() { 4 super.viewDidLoad() 5 // Do any additional setup after loading the view, typically from a nib. 6 7 let bounds = UIScreen.main.bounds 8 let frame = CG
用户5760343
2019/07/08
1.1K0
iOS中UIWebView的使用详解 原
     UIWebView继承与UIView,因此,其初始化方法和一般的view一样,通过alloc和init进行初始化,其加载数据的方式有三种:
珲少
2018/08/16
7990
iOS中UIWebView的使用详解
                                                                            原
UIWebView的使用
@interface ViewController ()<UIWebViewDelegate> @property (weak, nonatomic) IBOutlet UIBarButtonItem backItem; @property (weak, nonatomic) IBOutlet UIBarButtonItem forwardItem; @property(nonatomic,weak)UIWebView * webView; (IBAction)back; (IBAction)forwar
大师级码师
2021/10/31
4470
UIWebView的使用与总结
hh.jpeg 先前在项目中使用了UIWebView 在项目中一些比较复杂的UI布局、需后台灵活控制的界面、原网页,可以考虑UIWebView 在用它之前跟大家说下它的优缺点 优点: 可跨平台 开发一次可以部署iOS、Android等平台。 发布更新快 在服务器端发布,能够实时更新终端展示,便于快速升级以及紧急修复bug 排版布局能力强 强大的HTML+CSS让人膜拜 缺点: 性能 相对于原生的app来说,使用UIWebView的app相对来说性能会低一点,
Bison
2018/06/28
5810
苹果已经不再接收含UIWebView API的新App送审
根据近期提交App Store的情况反馈,苹果对带有UIWebView新开发App ,已经无法上传到App connect后台了。
Qson
2022/04/11
1.7K0
苹果已经不再接收含UIWebView API的新App送审
iOS 修改UIWebView的UserAgent
iOS和H5交互的时候,H5需要用userAgent带一些参数,需要我们修改默认的UserAgent为自定义的。 首先,给大家普及一下userAgent的历史,点击UserAgent查看。 1 在Appdelegate里面register一个新的UserAgent //get the original user-agent of webview UIWebView *webView = [[UIWebView alloc] initWithFrame:CGRectZero]; NSStrin
王大锤
2018/05/17
1.4K0
使用WKWebView替换UIWebView
代理方法 添加引用 import WebKit 代理 WKNavigationDelegate 页面加载状态的回调 代理方法 func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) { } func webView(_ webView: WKWebView, didCommit navigation: WKNavigation!) { } func webView(_ w
码客说
2019/10/22
1.9K0
为什么不推荐使用PHPicker
iOS 14 中系统新增了一个图片选择器 PHPicker,官方建议使用 PHPicker 来替代原有的 API 进行图片选择,下面我们来看看 PHPicker 的优点:
ios-lan
2020/10/23
2.6K0
为什么不推荐使用PHPicker
UI篇- UIWebView使用大全
UIWebView是常用开发控件,对于一些常用的设置是有必要记住或者记录下来的。 这里特别说一下,对于一个工程中整个就是一个WebView的情况,你可以通过一些设置来使整个工程显得接近于原生开发的APP,这样你是有机会被审核通过的。
進无尽
2018/09/12
2K0
UI篇- UIWebView使用大全
不推荐使用Spring Boot 2.2.0
目前 Spring Cloud Hoxton 未发布 RELEASE 版本,官方计划 本月发布
冷冷
2019/11/10
1.1K0
不推荐使用Spring Boot 2.2.0
MySQL为什么不推荐使用in
当然,每个具体的情况都是不同的,所以在选择查询操作符时,我们需要根据具体的需求和数据情况进行评估和测试。在优化查询性能时,我们可以使用MySQL的查询分析工具来帮助我们理解查询的执行计划和性能瓶颈,从而做出更好的决策。
程序员朱永胜
2023/09/07
3680
我为什么嫌弃RxJava,不再推荐使用?
链接 : https://juejin.im/post/5cd04b6e51882540e53fdfa2
JAVA葵花宝典
2019/08/29
1.5K0
cordova开发之plugman的使用
使用cordova混合开发的时候,往往需要插件的开发来满足需求,下面就说说cordova的插件的开发的流程。 第一步:创建插件 plugman create --name ShowToast --plugin_id com.tw.cordova.plugin --plugin_version 1.0.0 --name 插件名称,建议大写,这边会生成 类的名称 --plugin_id 建议写包名 --plugin_version 随便写 第二步:添加平台 plugman platform add
roc
2018/03/30
1.1K0
cordova开发之plugman的使用
cordova imagePicker 使用 原
 设置export class ContactPage {} 里面的默认的headface头像
tianyawhl
2019/04/04
7560
iOS下JS与原生OC互相调用(总结)
iOS开发免不了要与UIWebView打交道,然后就要涉及到JS与原生OC交互,今天总结一下JS与原生OC交互的两种方式。
Haley_Wong
2018/08/22
5K0
使用 Cordova 构建应用的流程
Cordova 应用程序有几个组件。 下图展示了 Cordova 应用程序体系结构的高级视图。
acc8226
2022/05/17
4.3K0
使用 Cordova 构建应用的流程
Hybrid App 应用开发中 5 个必备知识点复习
前言 我们大前端团队内部 📖每周一练 的知识复习计划还在继续,本周主题是 《Hybrid APP 混合应用专题》 ,这期内容比较多,篇幅也相对较长,每个知识点内容也比较多。 之前分享的每周内容,我都整理到掘金收藏集 📔《EFT每周一练》 上啦,欢迎点赞收藏咯💕💕。 注:本文整理资料来源网络,有些图片/段落找不到原文出处,如有侵权,联系删除。 一、什么是 Hybrid App,与 Native App 及 Web App 有什么区别 参考文章: 《Web App Hybrid App和 Native Ap
pingan8787
2019/09/05
2.3K0
Hybrid App 应用开发中 5 个必备知识点复习
为什么 MySQL 不推荐使用 join?
作者:李博 , 链接: https://cnblogs.com/liboware/p/12740901.html
Java小咖秀
2021/04/07
2.1K0
为什么 MySQL 不推荐使用 join?
为什么不推荐使用存储过程?
之所以有这个题目,我既不是故意吸引眼球,也不想在本文对存储过程进行教科书般论述。最近项目中遇到的存储过程问题,让我想起了去年在武汉出差时一位同事的发问:
芋道源码
2019/11/29
2K0
为何阿里不推荐MySQL使用join?
今天这篇文章,我就先跟你说说join语句到底是怎么执行的,然后再来回答这两个问题。
JavaEdge
2021/12/07
8980
为何阿里不推荐MySQL使用join?

相似问题

从mysql获取特定数据

10

从CustomArrayAdapter返回特定字符串

13

从承诺返回特定字符串

11

从响应返回特定字符串

31

从wcf返回特定数据

22
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文