zoukankan      html  css  js  c++  java
  • express mongodb 连接池

    因为网络上虽然有mongodb nodejs 连接池的教程,但是用的是已经过时的api,所以想出这个方法,分享一下

    需要基础的express的知识http://www.expressjs.com.cn/

    使用的是官方的mongodb驱动和generic-pool

    npm install --save mongodb generic-pool

    当然我写的也是按照官方问档来写的,如果头比较铁的也可以直接去看(滑稽),这里给出链接,看完文章后也可以看一下官方文档

    https://www.npmjs.com/package/generic-pool

    https://docs.mongodb.com/ecosystem/drivers/node/

    毕竟我写的博客也是中文的嘛。。。

    创建连接池代码:

    const MongodbClient = require('mongodb').MongoClient;
    const GenericPool = require('generic-pool');
    
    
    const factory = {
    
        create: function() {//创建链接
        return MongodbClient.connect("mongodb://" + "localhost" + ":" + "27017", { useUnifiedTopology: true });
        //返回一个mongodb的client链接对象 }, destroy:
    function(client) {//销毁链接 client.close();//关闭链接,这里需要注意,形参client就是上面我们创建的对象 } } // const opts = { max: 10,//最大链接数 min: 2//最小。。 } const myPool = GenericPool.createPool(factory, opts);//就是在这里创建链接池 module.exports = myPool;//export给其他模块使用

     创建factory对象和opt对象,分别表示创建和销毁的方法 与 选项

    使用方法,在这里我是使用了express的route,创建了一个路由user,当然这是express的知识,不讨论:

    const express = require('express');
    const Router = express.Router();
    const myPool = require('./db_pool');//这里的db_pool就是上面的代码文件
    
    Router.get('/user', (req, res, next) => {
        var name = req.query.name || '';//获得查询的参数
    
        var queryObject = {}
        if (name != '') {
            queryObject.name = name;
        }
    
        var resoursePro = myPool.acquire();//在这里请求一个连接池的连接,它返回的是一个promise对象,如果不明白的给个链接:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise
        resoursePro.then((client) => {     //这里的client就是上面我们在factory对象中create的返回值
            let cursor = client.db('dbname').collection('user').find(queryObject);//下面使用的就是常规操作啦,因为主要讲的连接池,就懒得写了...
            let somethign = cursor.toArray();
            somethign.then((result) => {
                // console.log(result);
                res.json(result);//响应查询的结果
                myPool.release(client).then(() => {//使用完了这个链接就要归还了啊
                    console.log('release')
                });
            }).catch((err) => {
                myPool.release(client).catch((err) => {
                    console.log(err)
                })
            })
        })
    })
  • 相关阅读:
    理解OO 思想 架构好一个程序之基石!~
    WP7 ZIP 压缩与解压缩
    Gis LBS 应用 剧本 (自己乱想的)
    PHP 入门 环境搭建
    Android 入门必须知道的 英文缩写
    Android 开发 数据结构理解 队列和栈 分析及实现
    c函数中形参为引用的情况;C++中*a和*&a的区别
    如何在.NET中使用尾递归
    [ProjectEuler.net] 25 找到第一个fib数,数位为1000位
    NFA_DFA
  • 原文地址:https://www.cnblogs.com/incredible-x/p/11924768.html
Copyright © 2011-2022 走看看