簡體   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