如何使用 Express 设置和检索 BookshelfJS 实例?
How do you set and retrieve an instance of BookshelfJS using Express?
我正在尝试使用 Bookshelf along with Express 4.0,但似乎无法让它们协同工作,或者更确切地说,我似乎无法遵循 "best practices"。 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;
如果我直接需要上面的代码,它就可以工作。这就是问题出现的地方。每当我想实际使用书架连接时,无论我在哪个文件中,我都遵循相同的过程但它失败并且 "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
属性 会引发错误(因为它未定义)。
从我可以使用的 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');
它只会被实例化一次并缓存以供以后调用。
我正在尝试使用 Bookshelf along with Express 4.0,但似乎无法让它们协同工作,或者更确切地说,我似乎无法遵循 "best practices"。 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;
如果我直接需要上面的代码,它就可以工作。这就是问题出现的地方。每当我想实际使用书架连接时,无论我在哪个文件中,我都遵循相同的过程但它失败并且 "bookshelf" 始终未定义。这是 index.js
文件的示例,该文件在 app.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');
它只会被实例化一次并缓存以供以后调用。