东风不度玉门 發表於 2019-11-24 22:16:00

express mongodb 连接池

<p>因为网络上虽然有mongodb nodejs 连接池的教程,但是用的是已经过时的api,所以想出这个方法,分享一下</p>
<p>&nbsp;</p>
<p>需要基础的express的知识http://www.expressjs.com.cn/</p>
<p>&nbsp;</p>
<p>使用的是官方的mongodb驱动和generic-pool</p>
<div class="cnblogs_code">
<pre>npm <span style="color: rgba(0, 0, 255, 1)">install</span> --save mongodb generic-pool</pre>
</div>
<p>&nbsp;</p>
<p>当然我写的也是按照官方问档来写的,如果头比较铁的也可以直接去看(滑稽),这里给出链接,看完文章后也可以看一下官方文档</p>
<p>https://www.npmjs.com/package/generic-pool</p>
<p>https://docs.mongodb.com/ecosystem/drivers/node/</p>
<p>毕竟我写的博客也是中文的嘛。。。</p>
<p>&nbsp;</p>
<p>创建连接池代码:</p>
<div class="cnblogs_code">
<pre>const MongodbClient = require('mongodb'<span style="color: rgba(0, 0, 0, 1)">).MongoClient;
const GenericPool </span>= require('generic-pool'<span style="color: rgba(0, 0, 0, 1)">);


const factory </span>=<span style="color: rgba(0, 0, 0, 1)"> {

    create: </span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">() {//创建链接<br></span><span style="color: rgba(0, 0, 255, 1)">    return</span> MongodbClient.connect("mongodb://" + "localhost" + ":" + "27017"<span style="color: rgba(0, 0, 0, 1)">, { useUnifiedTopology: </span><span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)"> });<br>    //返回一个mongodb的client链接对象
    },
    destroy: </span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">(client) {//销毁链接
      client.close();//关闭链接,这里需要注意,形参client就是上面我们创建的对象
    }
}
</span><span style="color: rgba(0, 128, 0, 1)">//</span>
const opts =<span style="color: rgba(0, 0, 0, 1)"> {
    max: </span>10<span style="color: rgba(0, 0, 0, 1)">,//最大链接数
    min: </span>2//最小。。<span style="color: rgba(0, 0, 0, 1)">
}

const myPool </span>=<span style="color: rgba(0, 0, 0, 1)"> GenericPool.createPool(factory, opts);//就是在这里创建链接池

module.exports </span>= myPool;//export给其他模块使用</pre>
</div>
<p>&nbsp;创建factory对象和opt对象,分别表示创建和销毁的方法 与 选项</p>
<p>&nbsp;</p>
<p>使用方法,在这里我是使用了express的route,创建了一个路由user,当然这是express的知识,不讨论:</p>
<div class="cnblogs_code">
<pre>const express = require(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">express</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">);
const Router </span>=<span style="color: rgba(0, 0, 0, 1)"> express.Router();
const myPool </span>= require(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">./db_pool</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">);//这里的db_pool就是上面的代码文件

Router.get(</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/user</span><span style="color: rgba(128, 0, 0, 1)">'</span>, (req, res, next) =&gt;<span style="color: rgba(0, 0, 0, 1)"> {</span>
    var name = req.query.name || <span style="color: rgba(128, 0, 0, 1)">''</span><span style="color: rgba(0, 0, 0, 1)">;//获得查询的参数

    var queryObject </span>=<span style="color: rgba(0, 0, 0, 1)"> {}
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> (name != <span style="color: rgba(128, 0, 0, 1)">''</span><span style="color: rgba(0, 0, 0, 1)">) {
      queryObject.name </span>=<span style="color: rgba(0, 0, 0, 1)"> name;
    }

    var resoursePro </span>=<span style="color: rgba(0, 0, 0, 1)"> myPool.acquire();//在这里请求一个连接池的连接,它返回的是一个promise对象,如果不明白的给个链接:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise
    resoursePro.</span><span style="color: rgba(0, 0, 255, 1)">then</span>((client) =&gt;<span style="color: rgba(0, 0, 0, 1)"> {   //这里的client就是上面我们在factory对象中create的返回值
      let cursor </span>= client.db(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">dbname</span><span style="color: rgba(128, 0, 0, 1)">'</span>).collection(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">user</span><span style="color: rgba(128, 0, 0, 1)">'</span>).<span style="color: rgba(0, 0, 255, 1)">find</span><span style="color: rgba(0, 0, 0, 1)">(queryObject);//下面使用的就是常规操作啦,因为主要讲的连接池,就懒得写了...
      let somethign </span>=<span style="color: rgba(0, 0, 0, 1)"> cursor.toArray();
      somethign.</span><span style="color: rgba(0, 0, 255, 1)">then</span>((result) =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> console.log(result);</span>
<span style="color: rgba(0, 0, 0, 1)">            res.json(result);//响应查询的结果
            myPool.release(client).</span><span style="color: rgba(0, 0, 255, 1)">then</span>(() =&gt;<span style="color: rgba(0, 0, 0, 1)"> {//使用完了这个链接就要归还了啊
                console.log(</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">release</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
            });
      }).catch((err) </span>=&gt;<span style="color: rgba(0, 0, 0, 1)"> {
            myPool.release(client).catch((err) </span>=&gt;<span style="color: rgba(0, 0, 0, 1)"> {
                console.log(err)
            })
      })
    })
})</span></pre>
</div>
<p>&nbsp;</p><br><br>
来源:https://www.cnblogs.com/incredible-x/p/11924768.html
頁: [1]
查看完整版本: express mongodb 连接池