如何在Node/Express应用程序中将应用程序放入路由文件中

16

我的app.js文件看起来像这样:

app = express();
setup.configure(app);
//...more stuff (e.g. database setup, middleware definition, etc.)...
var api = require('./routes/api');
app.use('/api', api);
module.exports = app;
在 routes/api.js 文件中,我使用类似以下这样的中间件来设置路由:
router.get('/myroute',
    app.sessionMW,
    function (req, res, next) {
        //...
    });

JSLint报错是因为我将app变量声明为全局的。如果我使用var进行声明,在路由中会出现undefined的错误。如果我在路由文件中使用var app = require('../app')来引用应用程序,我会得到以下错误:

Error: Route.get()要求回调函数但却得到了一个[object Undefined]。

我想通过下面的方式正确定义这个应用:

var app = express();

但是我该怎样在路由文件中访问这个应用程序?


2个回答

27
根据Express 4.x文档,您可以通过请求和响应对象轻松访问应用程序对象,使用req.appres.app

可以从Request对象和Response对象引用Express应用程序对象,分别使用req.appres.app

  • req.app

    此属性保存对使用中间件的Express应用程序实例的引用。

  • res.app

    res.appRequest对象中的req.app属性完全相同。

代码示例:

server.js:

var path = require('path');
var express = require('express');

var app = express();

app.set('firends', 'nodejs, python');

var page = require(path.join(
    __dirname,
    'page'
));
app.use('', page);

app.listen(3000);

page.js:

var express = require('express');

var router = express.Router();
router.get('/test-route', function (req, res) {
    var app = req.app; // get app object
    res.send('firends are: ' + app.get('firends')); // get firends from app
});

module.exports = router;

提示:

  • server.jspage.js在同一个文件夹里。
  • 使用命令运行: node server.js
  • 用以下链接访问: http://127.0.0.1:3000/test-route

9
你可以直接在你的routes/api.js文件中传入你的app对象:

app.js

var api = require('./routes/api')(app); // pass 'app'

routes/api.js

module.exports = function(app) {     
  ...
  router.get('/myroute', app.sessionMW, function (req, res, next) { //... });
  ...      
})

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接