如何使用Express设置和检索BookshelfJS的实例?

我试图使用书架和Express 4.0 ,似乎无法让他们一起工作,或者说,我似乎无法遵循“最佳实践”。 书架文档提到,应始终在整个应用程序中重复使用同一个实例。 它甚至列举了一个例子:

// 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文件的示例,这个文件是app.js需要的,名为“api”

 var express = require('express'); var app = express(); var db = app.get('bookshelf'); console.log(db); 

数据库总是出现未定义。 每当我试图做一个新的模型,我使用相同的过程,除了我做一个db.Model.extend({})和试图访问Model属性抛出一个错误(因为它是未定义的)。

从我可以使用书架和快速文档同意,这应该工作,而不是。 有任何想法吗?

每当你打电话时,这一行都会创build一个新的应用程序:

 var myApp = express(); 

如果你想设置或获取来自同一个应用程序的variables,你必须将其作为parameter passing。

 var api = require('./server')(myApp); 

然后在你的api模块中:

 module.exports = function(app){ var db = app.get('bookshelf'); //.... }; 

注意:你不必担心Node.js中的单例,你只需要这样做。

 var db = require('./path/to/db/config'); 

它只会被实例化一次,并为以后的调用caching。