如何将我初始化的书架对象暴露给我的路由文件?

Posted

技术标签:

【中文标题】如何将我初始化的书架对象暴露给我的路由文件?【英文标题】:How do I expose my initialized bookshelf object to my routes file? 【发布时间】:2014-11-27 13:23:07 【问题描述】:

由于这是我第一次涉足 nodejs/express/bookshelf,请尽可能对您的 cmets/answers 保持温和和详细。

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

在我的 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 提取数据...

(路线/问题.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 参考应用程序,只有代码 sn-ps 和 API 文档。

【问题讨论】:

【参考方案1】:

我也在学习 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/routes/question.js

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

【讨论】:

【参考方案2】:

我不记得我在哪里找到的,但我使用“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 代码。

【讨论】:

以上是关于如何将我初始化的书架对象暴露给我的路由文件?的主要内容,如果未能解决你的问题,请参考以下文章

Swiftui - 显示解码数据以查看时出错

使用 spread 将我从 API 获得的对象添加到我的初始数据源中

如何修改我的 File 对象的 .isFile() 或 .exists() 方法检查所述文件的位置?

Pulseaudio module-combine-sink 总是抛出失败

使用spread将我从API获得的对象添加到我的初始数据源中

设置初始 vuetify v-select 值