如何将我初始化的书架对象暴露给我的路由文件?
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 代码。
【讨论】:
以上是关于如何将我初始化的书架对象暴露给我的路由文件?的主要内容,如果未能解决你的问题,请参考以下文章
使用 spread 将我从 API 获得的对象添加到我的初始数据源中
如何修改我的 File 对象的 .isFile() 或 .exists() 方法检查所述文件的位置?
Pulseaudio module-combine-sink 总是抛出失败