Как повторно использовать Db Connections в Nodejs и Express - PullRequest
0 голосов
/ 25 февраля 2019

Мне интересно, как лучше всего повторно использовать соединения db, в моем случае это соединение couchebase в NodeJs, а также express.Для части Express я создал промежуточное программное обеспечение, подобное этому

var couchbase = require('couchbase')
var config = require('../config/config')

module.exports = (req,res,next)=>{
  var cluster = new couchbase.Cluster(config.cluster)
  cluster.authenticate(config.userid, config.password)
  let bucket = cluster.openBucket(config.bucket);
  bucket.manager().createPrimaryIndex(function() {});
  req.bucket = bucket;
  req.N1qlQuery = couchbase.N1qlQuery;
  next();
}

, которое прекрасно работает в приложении Express, так как я сообщаю ему

const dbSessionMiddleware = require('../middleware/couch')
app.use(dbSessionMiddleware) 

, что позволяет мне получить к нему доступ через req.bucket,Моя проблема в том, что в моем приложении есть контроллеры, которые в случае могут вызывать вспомогательную функцию, и они могут вызывать другую функцию для получения некоторых данных.Я хочу избежать необходимости передавать объект запроса на 5 уровней или около того, чтобы использовать промежуточное программное обеспечение.Есть ли лучший способ, как я могу выставить соединение / корзину нормальным функциям?

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

Вы пытались убрать свой код инициализации из функции промежуточного программного обеспечения?Документация Couchbase не показывает, как она используется таким образом.Хотя пример в ванильном узле.Поместив его в функцию промежуточного программного обеспечения, вы будете повторно подключаться к своей базе данных каждый раз, когда сервер получает запрос.

Я подключаюсь к своему серверу Mongo в теле app.js верхнего уровня, которое позволяетсвязь сохраняться.Затем я могу просто импортировать ссылку на mongoose, которая мне нужна в моих моделях и контроллере, чтобы наметить, как получать определенные данные, а затем вызвать метод контроллера внутри соответствующей конечной точки маршрута.

Отредактировано, чтобы показать примерназначение поля в качестве поля класса контроллера

В вашем app.js

const couchbase = require("couchbase");
const config = require("../config/config");

// ...app.js

const CouchController = require("../controllers/CouchController")(couchbase, config);

// app.js...

В вашем контроллере

class CouchController {

  constructor(couchbase, config) {
    // You may either pass couchbase and config as params, or import directly into the controller
    this.cluster = new couchbase.Cluster(config.cluster);
    this.cluster.authenticate(config.userid, config.password);
    this.bucket = cluster.openBucket(config.bucket);
    this.N1qlQuery = couchbase.N1qlQuery;
  }

  doSomeQuery(queryString, callback) {

    // Use your query however its meant to be used. I'm not familiar with couchbase queries.
    this.bucket.manager().createPrimaryIndex(function() {

      this.bucket.query(
        this.N1qlQuery.fromString("SELECT * FROM bucketname WHERE $1 in interests LIMIT 1"),
        [queryString],
        callback(err, result)
      )

    });
  }

}

Затем вызовите метод Controller изнутри маршрута

router.get("/", function(req, res, next) {

  let searchParam = req.query.someParam;

  CouchController.doSomeQuery(searchParam)
    .then(result => {
      res.json(result);
    });

});
0 голосов
/ 25 февраля 2019

Вы можете создать специализированный модуль (например, db.js), в котором вы реализуете одноэлементный пул соединений для вас.

// pseudo-code
export const getDb = () => {
  let db

  if (!db) {
    const connection = createConnectionPool()
    db = connection.db
  }

  return db
}

Эта функция может быть импортирована на ваше промежуточное ПО и на другие части вашегокод.

...