为了账号安全,请及时绑定邮箱和手机立即绑定

如何在Node.js Web应用程序中管理MongoDB连接?

/ 猿问

如何在Node.js Web应用程序中管理MongoDB连接?

慕哥6287543 2019-06-23 16:36:26

如何在Node.js Web应用程序中管理MongoDB连接?

我用的是节点-MongoDB-本机使用MongoDB编写一个网站的驱动程序。

我有一些关于如何管理连接的问题:

  1. 仅对所有请求只使用一个MongoDB连接就足够了吗?有什么性能问题吗?如果没有,我是否可以设置一个全局连接以便在整个应用程序中使用?

  2. 如果没有,那么在请求到达时打开一个新连接,在处理请求时关闭它好吗?打开和关闭连接费用昂贵吗?

  3. 我应该使用全局连接池吗?我听说驱动程序有一个本地连接池。这是个不错的选择吗?

  4. 如果我使用一个连接池,应该使用多少个连接?

  5. 还有什么我应该注意的吗?


查看完整描述

3 回答

?
莫回无

节点的主要提交者MongoDB本机说:

当应用程序启动并重用db对象时,打开do MongoClient.Connection一次。它不是一个单例连接池,每个.CONNECT创建一个新的连接池。

因此,要直接回答您的问题,请重用来自MongoClient.Connection()的db对象。这提供了池,并且与每个db操作上的打开/关闭连接相比,它将提供明显的速度增长。


查看完整回答
反对 回复 2019-06-23
?
慕姐4208626

在Node.js应用程序启动时打开一个新连接,并重用现有的db连接对象:

/server.js

import express from 'express';import Promise from 'bluebird';import logger from 'winston';import { MongoClient } from 'mongodb';import config
 from './config';import usersRestApi from './api/users';const app = express();app.use('/api/users', usersRestApi);app.get('/', (req, res) => {
  res.send('Hello World');});// Create a MongoDB connection pool and start the application// after the database connection is 
  readyMongoClient.connect(config.database.url, { promiseLibrary: Promise }, (err, db) => {
  if (err) {
    logger.warn(`Failed to connect to the database. ${err.stack}`);
  }
  app.locals.db = db;
  app.listen(config.port, () => {
    logger.info(`Node.js app is listening at http://localhost:${config.port}`);
  });});

/api/users.js

import { Router } from 'express';import { ObjectID } from 'mongodb';const router = new Router();router.get('/:id', async (req, res, next) => {
  try {
    const db = req.app.locals.db;
    const id = new ObjectID(req.params.id);
    const user = await db.collection('user').findOne({ _id: id }, {
      email: 1,
      firstName: 1,
      lastName: 1
    });

    if (user) {
      user.id = req.params.id;
      res.send(user);
    } else {
      res.sendStatus(404);
    }
  } catch (err) {
    next(err);
  }});export default router;

资料来源:如何在Node.js/Express应用程序中打开数据库连接


查看完整回答
反对 回复 2019-06-23
?
撒科打诨

下面是一些管理MongoDB连接的代码。

var MongoClient = require('mongodb').MongoClient;var url = require("../config.json")["MongoDBURL"]var option = {
  db:{
    numberOfRetries : 5
  },
  server: {
    auto_reconnect: true,
    poolSize : 40,
    socketOptions: {
        connectTimeoutMS: 500
    }
  },
  replSet: {},
  mongos: {}};function MongoPool(){}var p_db;function initPool(cb){
  MongoClient.connect(url, option, function(err, db) {
    if (err) throw err;

    p_db = db;
    if(cb && typeof(cb) == 'function')
        cb(p_db);
  });
  return MongoPool;}MongoPool.initPool = initPool;function getInstance(cb){
  if(!p_db){
    initPool(cb)
  }
  else{
    if(cb && typeof(cb) == 'function')
      cb(p_db);
  }}MongoPool.getInstance = getInstance;module.exports = MongoPool;

启动服务器时,调用initPool

require("mongo-pool").initPool();

然后,在任何其他模块中,您可以执行以下操作:

var MongoPool = require("mongo-pool");MongoPool.getInstance(function (db){
    // Query your MongoDB database.});

这是基于MongoDB文档..看看它。


查看完整回答
反对 回复 2019-06-23

添加回答

回复

举报

0/150
提交
取消
意见反馈 邀请有奖 帮助中心 APP下载
官方微信