如何将模型声明与数据库连接分开?

我想声明独立于特定连接configuration的模型。

一个理论代码将如下所示:

const connection = require('bookshelf')(knex); // Declare User model. const User = require('bookshelf') .Model .extend({ tableName: 'user' }); // Fetch data for data model using a specific instance of Bookshelf. User .use(connection) .fetchAll(); 

.use是一种制造方法。 我无法在bookshelf.js API中find等效的方法。

希望达到这种分离水平的原因是为了实现独立的testing。

我相信你的问题是一个configuration问题,而不是一个书架问题。 我认为你最好的办法是首先在节点中使用环境variables来存储你的数据库连接string。 这个想法是为不同的环境(开发,testing,阶段,产品等)从实际的代码库分离的具体configuration。 节点中有很多方法可以使用环境variables,所以我不会介绍所有这些variables。 一些好的是dotenv和node-foreman 。 我们使用node-foreman,因为我们主要运行在heroku上。 我有一个.env文件,其中包含没有签入git的configuration选项。 node-foreman支持json .env文件,所以我的看起来像这样:

 { "DATABASE_URL": "postgres://user:pass@host:port/schema", "LOG_LEVEL": "DEBUG" } 

它可能包括比这更多,但你明白了。 我将有多个.env文件为不同的环境(即.env.dev,.env.test,.env.stage等)。 同样,因为我使用node-foreman,所以我使用默认情况下使用.env文件的nf start它,但是可以使用-e标志,如下所示: nf -e .env.test start

然后,您可以在应用程序中使用process.env访问此configuration。 你可以有db.js:

 const dbOptions = {client: 'postgres', connection: process.env.DATABASE_URL}; const knex = require('knex')(dbOptions); const bookshelf = require('bookshelf')(knex); module.exports = { knex, bookshelf, } 

然后,您需要在您的模型文件中需要它的地方。 所以这可能会在usermodel.js中:

 const bookshelf = require('./db').bookshelf; const User = bookshelf .Model .extend({ tableName: 'user' }); module.exports = { User, } 

然后,在你的app.js(或任何需要查询用户的地方):

 const User = require('./usermodel').User; User.fetchAll(); 

所以,一旦你有了这个设置,你只需用nf -e .env.whatever来启动你的应用程序