Express.js查看"全局"

Dom*_*nes 44 javascript node.js express

我正在使用Express.js(在Node.js上),我知道您可以通过"locals"参数使用自定义数据渲染视图.(res.render("template", { locals: { foo: "bar" } });)

有没有办法拥有"全局"?(即每个视图都可访问的数据)

我看到了view options,但这不是递归的,所以如果我在模板中使用任何locals,它会替换我设置的locals.

这是我的用例:我想这样做,以便可以在每页的基础上添加CSS/JS文件,这是我的主要布局的一部分.问题是,如果我没有在每个渲染上显式设置这些数组,我会得到一个未定义的错误,所以在我的模板中我总是要typeof css !== "undefined"跳舞.此外,我还有其他选择框选项列表,我不希望显式添加到我的每个表单.

tig*_*nch 57

对于那些自Express 3发布以来可能遇到过这个问题的人来说,值得注意的是,'dynamicHelpers'方法不再存在.

相反,您可以使用app.locals函数,该函数充当您可以存储值或函数的对象,然后使它们可用于视图.例如:-

// In your app.js etc.
app.locals.title = "My App";
app.locals({
    version: 3,
    somefunction: function() {
        return "function result";
    }
});

// Then in your templates (shown here using a jade template)

=title
=version
=somefunction()  

// Will output

My App
3
function result
Run Code Online (Sandbox Code Playgroud)

如果您需要访问请求对象以从中提取信息,您可以编写一个简单的中间件函数并使用app.settings变量.

例如,如果您使用connect-flash向用户提供消息,则可能会执行以下操作:

app.use(function(req, res, next) {
    app.set('error', req.flash('error'));
    next();
});
Run Code Online (Sandbox Code Playgroud)

这将使您在模板中使用= settings.error访问错误消息.

这里讨论了这些主题,尽管有些简短:http://expressjs.com/api.html#app.locals

更新:快递4

app.locals 现在是一个简单的JavaScript对象,因此必须逐个设置每个属性.

app.locals.version = 3;
app.locals.somefunction = function() {
    return "function result";
}
Run Code Online (Sandbox Code Playgroud)

res.locals提供完全相同的功能,但它应该用于特定于请求的数据而不是应用程序范围的数据.用户对象或设置是常见用例.

res.locals.user = req.isAuthenticated() ? req.user : null;
res.locals.userSettings = {
    backgroundColor: 'fff'
}
Run Code Online (Sandbox Code Playgroud)

  • 我发现的最佳解释.我一直在搜寻.谢谢. (5认同)

ale*_*lex 10

有一种方法可以使用动态视图助手为视图创建"全局"变量.

从Express.js指南:

app.dynamicHelpers(OBJ)

注册动态视图助手.动态视图助手只是接受req,res的函数,并在呈现视图之前针对Server实例进行评估.此函数的返回值将成为与其关联的局部变量.

app.dynamicHelpers({session:function(req,res){return req.session;}});

所有视图现在都有可用的会话,以便可以通过session.name等访问会话数据:

你可以在这里找到一个关于如何使用它们的真实例子:https://github.com/alessioalex/Nodetuts/tree/master/express_samples(node app.js来启动应用程序)


mik*_*ikl 7

作为作者提到的使用视图选项的真实示例:

var app = express.createServer();

app.configure(function() {
  app.set('views', path.join(__dirname, '..', 'views'));
  app.set('view engine', 'jade');
  app.set('view options', {
    assetVersion: 1
  });
Run Code Online (Sandbox Code Playgroud)

然后在我的layout.jade(在我的情况下为应用程序的基本模板):

link(rel='stylesheet', href='/static/css/' + assetVersion + '/style.css')
script(src='/static/js/' + assetVersion + '/script.js')
Run Code Online (Sandbox Code Playgroud)

有了这个小技巧,我只需要更新assetVersion变量一个地方,以确保我的资产不会在Varnish或其他地方缓存.