在Express或Connect中添加一堆属性以请求是不好的做法?

例如,假设您使用winston进行日志logging,而不是让每个中间件都需要日志logging器,则可能有一个(上游)中间件将其添加到request对象中,以便其他中间件可以执行:

 request.logger.log(...) 

这是好还是不好的做法?

在我看来,这样做并不是很好的做法。

首先,你把希望不存在的东西摆在req对象之后,而且将来不会存在。 如果他们这样做,你会破坏的东西,也许甚至没有注意到它。 更糟糕的是,如果今天使用的属性名称正在被使用的任何中间件的未来版本中使用,则会出现问题。 而且肯定你不会每一次检查这个小的更新。

然后,它引入了中间件模块之间的依赖关系。 但是这些依赖关系并不明确,它们是隐含的:只有在中间件A之后运行中间件B的情况下才有效,但是在代码中没有performance出来。 如果你改变顺序,你可能只会有一点帮助undefined is not a function错误。

这是我为什么认为这是一个不好的做法的两个主要问题。 当然,没有一个规则是毫无例外的,但是如果你问一个经验法则,我会尽量避免这个规则。

顺便说一下,当您看一下迁移Express 3.x到4.x的指南时 ,您可以阅读以下段落:

全球连接修补节点的原型。 这被认为是不好的行为,并已被删除连接3。

由于这明确提到了res对象,这也很好地回答你不应该这样做,这样做应该被认为是不好的做法。

这基本上和我在这里写的一样。

希望这可以帮助。