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

时间:2015-01-19 23:10:10

标签: javascript node.js express bookshelf.js

我正在尝试将BookshelfExpress 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所需的app.js文件示例,称为“api”:

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

DB 总是出现未定义。每当我尝试创建一个新模型时,除了执行db.Model.extend({})之外,我使用相同的过程并尝试访问Model属性会抛出错误(因为它未定义)。

从我可以使用的书架和Express文档都同意这应该有效,但事实并非如此。有什么想法吗?

1 个答案:

答案 0 :(得分:6)

每次调用时,此行都会创建一个新应用:

var myApp = express();

如果您想从同一个应用程序设置或获取变量,则必须将其作为参数传递。

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

然后在你的api模块中:

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

旁注:您不必担心Node.js中的单身人士,您只需要它就可以了。

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

它只会被实例化一次并缓存以供以后调用。