由于这是我第一次涉及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文档。
答案 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代码。