我有一个使用多个路由器的ExpressJS应用程序。以下是将所有内容联系在一起的主应用程序的基本形式。
var express = require('express');
var routes = require('./routes/index');
var app = express();
app.set('someKey', someObj);
app.use('/', routes);
module.exports = app;
为简洁起见,我删除了大部分代码。
在那个./routes/index.js文件中,我已经在表格中定义了一个Express Router:
var express = require('express');
var router = express.Router();
router.get('/', function(req, res) {
res.render('index', { title: 'Express Test' });
});
module.exports = router;
我试图使用以下内容从路由器内部访问“somekey”:
var app = require('../app');
var foo = app.get('somekey');
这与运行时崩溃并烧毁,通知我没有这样的方法获取应用程序(进一步调查产生该应用程序只是一个默认对象)。
我认为我忽略了一些非常明显的事情。
我计划将一个knexjs对象传递给处理数据库调用的每个路由器。在代码的当前状态中,它在每个路由器上重复。我希望在主应用程序中定义一次,然后由所有路由器使用,以便在主应用程序中进行更改时,它会反映在路由器上。
答案 0 :(得分:2)
如果您需要app
,那么您并未完全引用您在app.js
中定义的应用对象。相反,您要求输出的文件。要获得您想要达到的目标,可以使用类似的东西。
在你的app.js
中var express = require('express');
var app = express(); // Note the switched order
app.set('someKey', someObj);
var routes = require('./routes/index')(app);
app.use('/', routes);
module.exports = app;
然后在你的路线中:
var express = require('express');
var router = express.Router();
/* Wrap everything inside a function */
module.exports = function(app){
console.log(app.get('someKey')); // Access app passed to it from app.js
/* Declare all your routes here. app variable will be accessible */
router.get('/', function(req, res) {
res.render('index', { title: 'Express Test' });
});
return router;
};
基本上,每当你需要A中的文件B并希望将变量从A传递给B时,这就是你遵循的一般模式。
看看是否有帮助。 :)