2

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

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

因此,与其将自定义数据对象传递给呈现的翡翠,不如将数据附加到请求中,从而允许在翡翠中处理更多逻辑。例如:

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

做这种技术会有后果吗?这能不能令人不悦或钦佩?会不会暴露太多玉?性能影响?

例如,这里有些人希望将请求中已经存在的数据发送到玉:

我相信还有更多相关的问题可以通过发送请求来解决。不推荐,为什么呢?

4

2 回答 2

9

如何express处理当地人的设计似乎是“包括需要的东西”。它只是不对那是什么做出任何假设。

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

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


旁注:我建议将其定义reqrequest本地而不是其属性:

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

这至少提供了以下好处:

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

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

您也可以将它附加在一个小型中间件中,这样它就不是特定于路由的:

app.use(function (req, res, next) {
    res.locals.req = req;
    next();
});
于 2013-05-07T17:41:15.040 回答
2

这样做的最大问题res.render("index", req)是,最有可能的是,req对象包含的信息不足以创建完整的响应。不知何故,您需要一种从 Jade 模板代码中提取更多数据的方法,为此我不知道有什么办法,只能使用全局变量,这确实会导致一个非常奇怪的架构。一般来说,最好让您编写的代码假定其使用方式的最小值,包括它在什么样的环境中运行。这也适用于模板。

将整个req对象作为您发送给翡翠模板的变量的一部分传递,ieres.render({req:req,data:someOtherData})也是有问题的,因为它使模板依赖于完整的请求对象。当您想要在 Express 请求的上下文之外使用它时,您不能重用该模板。更具体地了解您发送到模板的数据并不难。但实际上,这个原则几乎适用于任何代码。

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

于 2013-05-07T17:39:25.200 回答