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

时间:2016-08-18 15:58:18

标签: node.js bookshelf.js

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

理论代码如下:

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是一种虚构的方法。我在 API中找不到等效的方法。

想要这种分离水平的原因是为了实现孤立测试。

1 个答案:

答案 0 :(得分:-1)

我认为您的问题是配置问题,而不是书架问题。我认为您最好的方法是首先在节点中使用环境变量来存储数据库连接字符串。我们的想法是针对与实际代码库分离的不同环境(开发,测试,阶段,产品等)进行特定配置。有很多方法可以在节点中使用环境变量,所以我不会进入所有这些变量。一些好的是https://wordpress.org/plugins/redirection/dotenv。我们使用node-foreman,因为我们主要在heroku上运行。我有一个.env文件,其中包含未检入git的配置选项。 node-foreman支持json .env文件,所以我看起来像这样:

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

它可能包括更多,但你明白了。我会为不同的环境(即.env.dev,.env.test,.env.stage等)提供多个.env文件。同样,由于我使用node-foreman,我使用nf start启动它,默认使用.env文件,但你可以像这样使用-e标志:nf -e .env.test start

然后,您可以在应用中使用process.env访问此配置。然后你可以拥有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

的其他配置启动您的应用