Express Router中的Access Express应用程序

时间:2014-11-20 05:35:42

标签: javascript node.js express

我有一个使用多个路由器的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对象传递给处理数据库调用的每个路由器。在代码的当前状态中,它在每个路由器上重复。我希望在主应用程序中定义一次,然后由所有路由器使用,以便在主应用程序中进行更改时,它会反映在路由器上。

1 个答案:

答案 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时,这就是你遵循的一般模式。

看看是否有帮助。 :)