【发布时间】:2022-01-13 18:24:01
【问题描述】:
我加入了一个小型开发团队来创业。我们甚至还没有推出。我收到了一个用 node/express 编写的后端服务。除了小型宠物项目,我还没有使用过这项技术。我正在考虑实现一个样式指南,以保持代码的一致性,目标是在其他后端服务中也实现这一点。
这让我想到了 Airbnb 风格指南。这部分突然出现在我身上。 Never mutate parameters
// bad
function f1(obj) {
obj.key = 1;
}
// good
function f2(obj) {
const key = Object.prototype.hasOwnProperty.call(obj, 'key') ? obj.key : 1;
}
在 express 中,通常有这样定义的控制器:
async function someController(req, res, next) {
// I've seen similar code to this
req.someNewProp = "Some new value."
res.status(200).json({"someJSONKey":"someJSONVal"});
}
中间件通常是这样定义的:
// Route
router.get('/endpoint', function1, function2)
async function function1(req, res, next) {
// I've seen similar code to this
req.someNewProp = "Some new value."
// Pass req and res to function2
next();
}
我注意到req 对象在被传递时被修改了很多。数据在中间件和其他函数中被添加到这个对象,因为它在返回响应之前被传递。编写代码的原始开发人员将其称为“将事物保持在请求范围内”。但这似乎直接与风格指南中的一个要点相矛盾,让我怀疑这是否是不好的做法。
所以现在的问题是,是否有一种“更好”或更广泛接受的方式来跟踪请求上下文中的事物,而不会改变原始请求对象?有哪些方法可以做到这一点?
【问题讨论】:
-
该建议主要适用于表示程序状态的对象。如果只是将参数打包成函数的一种方式,一般来说问题不大。
-
req是唯一可以默认存储请求相关人员的地方。当然,您可以为每个请求分配其自己的唯一标识符(但您再次需要将其存储在req中)并使用它将所有与请求相关的信息存储在其他地方。但是这样一来,您将需要为这些记录添加过期时间。所以总而言之修改req也不错 -
Airbnb 是一个风格指南,即一个固执己见的 linter,我不会碰它,因为它强制使用分号(此外,在其不使用分号的好/坏示例中,它使用内联异步 IIFE,即本身就是不好的做法)ewww,以基于意见的方式结束
-
@LawrenceCherone 风格指南是我掉进兔子洞的原因。我更感兴趣的是直接修改请求是否被认为是不好的做法以及有哪些替代方法。
-
Express 没有简单的替代方案。中间件需要将其结果传递给稍后处理的请求处理程序,
req对象就是这样做的方法。 Express 是专门以这种方式设计的,它希望您在req对象上添加/修改属性。这是其设计的核心。在这种情况下,我会忽略 airbnb 指南的建议。请注意,这些是指南,而不是规则,这是有原因的——它们并不普遍适用于所有情况。这是不适用的情况之一。
标签: javascript node.js express