如何将初始化的书架对象公开给我的路径文件?

时间:2014-11-27 13:23:07

标签: express bookshelf.js

由于这是我第一次涉及nodejs / express / bookshelf,如果可能的话,请对你的评论/答案保持温和和粗略。

我很难弄清楚如何在书架上正确使用快递,特别是在各种模块中暴露物品。书架文档说理想情况下,初始化应该只发生一次,并且应该在整个库中返回初始化的书架实例。

在我的app.js文件中,我创建了一个knex / bookshelf连接到我的数据库,我还定义了我的模型映射到我想要的表..

(app.js)

var knex = require('knex')({
    client: 'sqlite3',
    connection: {
        filename: '<path-to-my-db'
    }
});

...
var questionRoutes = require('./routes/questions');
var app = express();
var bookshelf = require('bookshelf')(knex);

// define model
var Question = bookshelf.Model.extend({
    tableName: 'questions'
});

...

app.use('/', routes);
app.use('/api', questionRoutes);

在我的路由文件中,我想使用Bookshelf提取数据......

(路径/ quesions.js)

var express = require('express');
var router = express.Router();

// on routes that end in /questions ...
router.get('/questions', function (req, res) {
    new Question()
        .fetchAll()
        .then(function (questions) {
            console.log(questions.toJSON());
        });
});

...但是如何将我的Question模型对象公开给我的路由文件?或者,如果我将模型定义移动到我的路由,那么如何公开我初始化的bookshelf实例?

我还没有能够为Bookshelf找到任何有用的参考应用,只需要代码片段和API文档。

2 个答案:

答案 0 :(得分:3)

我正在学习node.js和相关的东西;我会这样做:

lib / common / bookshelf.js 设置Bookshelf.js:

var dbConfig = {
   client: 'sqlite3'
   // ...
};
var knex = require('knex')(dbConfig);
var bookshelf = require('bookshelf')(knex);
module.exports = bookshelf;

lib / model / question.js 文件来定义问题模型:

var bookshelf = require("../common/bookshelf");
var Question = bookshelf.Model.extend({
    tableName: 'questions'
});

<强> LIB /路由/ question.js

var Question = require('../model/question');
// rest of the code.

答案 1 :(得分:1)

我不记得我在哪里发现了这个,但我使用“make”功能来支持传递支持单身助手(如书架)。导出make函数,然后每当我包含路径文件时我都会调用它。请参阅以下示例:

index.js(主文件)

var passport = require('passport');

var knex = require('knex')({
    client: 'mysql',
    connection: {
        host     : 'localhost',
        user     : 'user',
        password : 'password',
        database : 'database',
        charset  : 'utf8'
    }
});
var bookshelf = require('bookshelf')(knex);

require('./routes/user')(app, bookshelf);

user.js路由文件

module.exports = function(app, bookshelf) {

   app.get('/user/id/:id', function (req, res) {    
      User = require('../models/user').make(bookshelf);
      ... // do something
   });
}

<强>更新

我刚刚将上面的代码重构为支持文件,我称之为数据存储区,然后将其指定为应用程序的属性。

// datastore.js
module.exports = function (app) {
    app.set('datastore', bookshelf);

    return bookshelf;
};


// app.js
var datastore = require('./lib/datastore')(app);
app.set('datastore', datastore);

到目前为止,这两个选项对我有用,但我选择后者尝试重构更多的app.js代码。