Express:访问路线中的app.set()设置

Sco*_*ott 27 node.js express

在Express中,我开始相信可以通过在我的主app.js文件中执行类似以下操作来创建全局应用程序设置:

var express = require('express'),
    ...
    login = require('./routes/login');

var app = express();

app.configure(function(){
  ...
  app.set('ssoHostname', 'login.hostname.com');
  ...
});
...
app.get('/login', login.login);
...
Run Code Online (Sandbox Code Playgroud)

现在./routes/login.js,我想访问app.settings.ssoHostname,但如果我尝试运行任何类似的东西(根据:如何在快递js中使用app.set()设置变量):

...
exports.login = function(req, res) {
  var currentURL = 'http://' + req.header('host') + req.url;
  if (!req.cookies.authCookie || !User.isValidKey(req.cookies.authCookie)) {
    res.redirect(app.settings.ssoHostname + '/Login?returnURL=' + encodeURIComponent(currentURL));
  }
};
...
Run Code Online (Sandbox Code Playgroud)

它不承认app:

ReferenceError: app is not defined
Run Code Online (Sandbox Code Playgroud)

我的问题是:

  1. 我采用的app.set()用于全局设置的方法是否经常以"正确"的方式重复使用,如果是这样的话......
  2. 如何在路线中访问这些设置?
  3. 如果不app.set()经常使用全局设置,我将如何在路线中设置和获取自定义设置?

Dar*_*kas 96

使用 req.app.get('ssoHostname')

  • 所有请求/响应对象都有一个属性`app`,它引用正在处理该请求/响应的Express应用程序.除了`req.app.get('ssoHostname')`之外,你还可以使用`req.app.settings.ssoHostname`. (6认同)
  • 这适合我.我正在使用config.json和dev-prod的app-settingvalues. (3认同)
  • 知道为什么这是没有记录的吗?跟踪git历史回来似乎这已经工作了很长时间(至少从2011年开始). (3认同)

pif*_*tic 2

app.js文件的末尾:

module.exports = app;
Run Code Online (Sandbox Code Playgroud)

然后在routes/login.js:

var app = require('../app');
Run Code Online (Sandbox Code Playgroud)

现在您可以访问实际app对象,但不会获得ReferenceError.

  • 永远不要这样做,因为这假设在所有应用程序中使用相同的应用程序实例. (21认同)
  • 请考虑接受Darius/Spudley的回答.这个接受的答案是错误的 (8认同)
  • req.app.locals是最好的做法? (3认同)
  • 如果我想从其他文件(如routes/blah.js)访问app.locals,最佳实践是什么? (2认同)