我有一个使用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对象?
答案 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(); });