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

标签 javascript node.js express bookshelf.js

我正在尝试使用 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;

如果我直接需要上面的代码,它就可以工作。这就是问题出现的地方。每当我想实际使用书架连接时,无论我在哪个文件中,我都遵循相同的过程但它失败并且“书架”始终未定义。以下是 app.js 中所需的名为“api”的 index.js 文件示例:

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

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

据我所知,Bookshelf 和 Express 文档都认为这应该有效,但事实并非如此。有什么想法吗?

最佳答案

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

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');

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

关于javascript - 如何使用 Express 设置和检索 BookshelfJS 实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28035116/

相关文章:

javascript - 在 iOS 5 HTML5 应用程序中通过 javascript 事件播放声音

javascript - jquery beforeunload 消息取决于单击的按钮

javascript - 使用javascript过滤剪切/复制选择?

node.js - 风 sails JS : Best way to seed initial users

mysql - 在nodejs、expressjs和jade中未获取参数

javascript - 使用 Express/Sendgrid 将电子邮件模板用于联系表单

javascript - 是否定义了内置函数来将数据保存在 codemirror 中(键映射函数除外)?

javascript - Mongodb 返回旧集合

node.js - 登录heroku上的express服务器

json - 在 Node + express + Jade 中将对象传递给客户端?