将请求对象传递给express.js中的jade

时间:2013-05-07 17:19:52

标签: node.js express pug

将请求对象传递给jade渲染器会出现什么问题?

这似乎是一种简单的工作方式。特别是当express.js已经将请求对象用作附加数据的载体时,因为HTTP请求进入其中间件端点。

因此,不是将自定义数据对象传递给渲染的玉,而是可以将数据附加到请求,从而允许在jade中处理更多逻辑。例如:

app.get("/", function (req, res) {  
   res.render("index", req);
});

做这种技术有后果吗?这可能是皱眉还是羡慕?它可能会暴露给玉石吗?性能影响?

例如,以下是一些希望将请求中的数据发送给jade的人:

我确信有更多相关问题可以通过发送请求来解决。这不是建议,为什么?

2 个答案:

答案 0 :(得分:9)

express如何处理本地人的设计似乎是“包含所需内容。”它只是没有对这是什么做出任何假设。

因此,如果在您的情况下,您需要附加到请求的大部分属性,并且不希望从中“提取”它们(“而不是将自定义数据对象传递给呈现的玉“),然后应该没问题。

但是,可能的问题不在于您是否将其包含在本地人中,而是您是否将其用作拐杖并使视图过于复杂。您希望保持您的观点相当简单,只需“足够智能”即可呈现所需内容。


附注:我建议定义它,以便reqrequest是本地而非属性:

res.render("index", { req: req });

这至少提供了以下好处:

  1. 由于Express有3个本地人来源需要合并(app.localsres.localslocals传递给res.render()),这样就可以完成在单个属性之后,而不是必须遍历请求中的所有内容。

  2. 任何方法仍然附加到实例而不是复制到普通Object

  3. 您也可以将它附加在一个小型中间件中,因此它不是特定于路由的:

    app.use(function (req, res, next) {
        res.locals.req = req;
        next();
    });
    

答案 1 :(得分:2)

执行res.render("index", req)的最大问题是,req对象很可能包含的信息不足以创建完整响应。你不知何故需要一种方法从Jade模板代码中提取更多数据,我不知道如何使用全局变量,这将导致一个非常奇怪的架构。一般来说,最好让你编写的代码假定它的使用方式,包括它运行的环境类型。这同样适用于模板。

将整个req对象作为发送到jade模板的变量的一部分传递,即res.render({req:req,data:someOtherData})也存在问题,因为它使模板依赖于完整的请求对象。在某些时候 - 您希望在Express请求的上下文之外使用它时,您无法重复使用该模板。对于您发送到模板的数据更加具体并不难。但实际上,这个原则几乎适用于任何代码。

你提到了一个潜在的好处“允许用玉石处理更多的逻辑”。我想知道这有什么好处。玉可以做一些逻辑,但对我来说,感觉就像一个相当紧张的环境。它适用于偶尔的循环或条件,但不适用于其他任何东西。请求处理程序是执行更高级逻辑的理想位置。

相关问题