繁体   English   中英

销毁书架/knex 连接池

[英]Destroying bookshelf/knex connection pool

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

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

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 对象的情况下销毁连接池?

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

本教程展示了如何在 API 导入书架上使用knex.destroy()

书架上:

module.exports.knex = knex;

在 API 调用书架上:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM