BookshelfをExpress 4.0と一緒に使用しようとしていますが、それらを連携させることができないか、「ベスト プラクティス」に従っているようには見えません。Bookshelf のドキュメントには、アプリ全体で同じインスタンスを常に再利用する必要があると記載されています。例も挙げています:
// When the app starts
var app = express();
var knex = require('knex')(dbConfig);
var bookshelf = require('bookshelf')(knex);
app.set('bookshelf', bookshelf);
// elsewhere, to use the bookshelf client:
var bookshelf = app.get('bookshelf');
var Post = bookshelf.Model.extend({
// ...
});
app.get()
ただし、別のファイルで使用する必要がある場合は、機能しないようです。たとえば、これが私のapp.js
ファイルです (アプリ全体のルート):
var express = require('express');
var app = express();
var db = require('./server/db/db');
app.set('bookshelf', db);
var api = require('./server');
app.use(api);
上記で必要になる私のdb.js
ファイルは次のとおりです。
var express = require('express');
var app = express();
var knex = require('knex')({ //my db settings go here });
var bookshelf = require('bookshelf')(knex);
module.exports = bookshelf;
上記のコードは、直接必要な場合に機能します。ここで問題が発生します。本棚接続を実際に使用したいときはいつでも、現在のファイルに関係なく、同じプロセスに従いますが、失敗し、「本棚」は常に未定義です。必要なファイルの例を次に示しindex.js
ます。「api」と呼ばれますapp.js
。
var express = require('express');
var app = express();
var db = app.get('bookshelf');
console.log(db);
DBは常に未定義として表示されます。新しいモデルを作成しようとするたびに、同じプロセスを使用db.Model.extend({})
しますが、プロパティにアクセスしようとするとModel
エラーがスローされます (未定義であるため)。
Bookshelf と Express の両方のドキュメントを使用できることから、これは機能するはずであり、機能しないことに同意します。何か案は?