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)
            })
        })
    })
})

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM