销毁书架/ knex连接池

时间:2015-12-23 15:18:41

标签: node.js bookshelf.js knex.js

我有一个使用Bookshelf / Knex的db api。

我有多个看起来像这样的Bookshelf模型:

import bookshelf from '../bookshelf';

var Product = bookshelf.Model.extend({
  tableName: 'product'
  // ...
});
export default Product;

书架包括:

import dbConfig from './dbConfig';

const knex = require('knex')(dbConfig);
const bookshelf = require('bookshelf')(knex);

module.exports = bookshelf;

我还有多个api动作调用,看起来像这样:

import Product from '../../Models/Product';

export default function getProducts(bookshelf) {

  return new Promise((resolve) => {

    Product.collection().fetch().then((products) => {
      resolve({
        products
      });
    });
  });
}

我的问题是knex池连接,我需要在解析操作文件中的请求之前销毁连接池。但是,为了做到这一点,我需要访问模型中导入的书架或knex对象。

我想不出一个干净利落的方式。我可以在调用该操作的顶级文件中创建knex对象,然后该进程可能在收到响应时破坏连接。但是我必须将它传递给动作然后传递给模型。我怎么能这样做,以便连接池被销毁而不必在任何地方传递knex对象?

2 个答案:

答案 0 :(得分:0)

我遇到过这种情况并通过导出knex对象作为书架导出的属性来解决它(即将行module.exports.knex = knex;添加到书架的底部包括)。这样,您可以使用bookshelf.knex.destroy()访问其他地方。它对于书架未实现您需要进行的某些查询(例如bookshelf.knex.raw('Some unsupported SQL query'))的情况也很方便。

答案 1 :(得分:0)

This tutorial显示了如何在用于导入书架的API上使用knex.destroy()

在书架上:

module.exports.knex = knex;

在API调用书架上:

const knex = require('./bookshelf').knex; 
...
Product.collection().fetch()
.then((products) => {
      resolve({
        products
      });})
.finally(() => { knex.destroy(); });