有什么理由不将请求/响应作为参数传递?
Any reason not to pass request / response as a parameter?
在 express 中,我有一个路由 ex 的处理程序:
router.get(`${api}/path/:params/entrypoint`, routeHandler);
在这个例子中 'routeHandler' 函数有很多逻辑来做各种事情。我想将 'routeHandler' 分解为更小的方法以简化可读性和可测试性。所以代替:
routeHandler(req, res) {
//many lines of code
}
我们可以:
routeHandler(req, res) {
helperOne(req, res);
helperTwo(req, res);
}
helperOne(req, res) {
//do stuff
}
helper2(req, res) {
//do stuff
}
一位相当年长的同事告诉我不要这样做,但我不明白为什么。有谁知道将响应或请求对象传递给助手可能会出现的任何问题?我想不出任何答案,google 没有透露任何明确的答案。
谢谢!
Does anyone know of any issues that can arise by passing the response or request objects into helpers?
是的,您可能 运行 在传递这些参数时遇到一些问题,尤其是 res
。例如,您可以 res.send
多次(每个函数中一次),这将引发异常。
场景
一个更具体的例子是这个
routeHandler((req, res) => {
helperOne(req, res);
helperTwo(req, res);
});
根据某些情况,我想停止 return 来自 helperOne
的错误,而不去执行来自 helperTwo
的任何代码。我对这些函数的定义是这样的
helperOne = (req, res) => {
const dataPoint = req.body.dataPoint; // a number for example
if (number > 10) {
return res.send("This is not valid. Stopping here...");
} else {
console.log("All good! Continue..");
}
}
helperTwo = (req, res) => {
res.send("Response from helperTwo");
}
然后假设我有 req.body.dataPoint = 10
,现在我希望我的 routeHandler
在 if
语句的第一个块中的 return res.send
之后停止在 helperOne
.
虽然这不会按预期工作,因为 return
将只涉及 helperOne
,即 returning 函数。换句话说,它不会传播到routeHandler
。
最后将引发异常,因为 routeHandler
将调用 helperTwo
并尝试再次发送响应 。
解决方案
- 不要发送
req
或 res
。只需传递您需要的数据并在 main 处理程序 中处理响应
- 更好的选择是使用 Express middlewares。由于您有多个 “顺序” 处理程序,您可以链接多个中间件,这更接近标准 Express.JS 方式
避免这样做的一个原因是您将辅助函数与 routeHandler
紧密耦合,并鼓励辅助函数的复杂性。如果您拆分辅助函数,使它们只承担单一职责,那么您很可能只需要传递请求的一个子集。
你为什么要传入 res
,你是从助手内部发送响应吗?在不知道您的 routeHandler
实现细节的情况下,我会看看您是否可以处理助手中的逻辑,但让它们每个 return 一个值并在主 routeHandler
中保持响应发送功能。这是一个简单的例子:
handleRoute('/users/:userID', (req, res) => {
const { userID } = req.params;
const idIsValid = validateUserID(userID);
if (!idIsValid) {
return res.status(400).send('Invalid user ID!');
}
...
});
在 express 中,我有一个路由 ex 的处理程序:
router.get(`${api}/path/:params/entrypoint`, routeHandler);
在这个例子中 'routeHandler' 函数有很多逻辑来做各种事情。我想将 'routeHandler' 分解为更小的方法以简化可读性和可测试性。所以代替:
routeHandler(req, res) {
//many lines of code
}
我们可以:
routeHandler(req, res) {
helperOne(req, res);
helperTwo(req, res);
}
helperOne(req, res) {
//do stuff
}
helper2(req, res) {
//do stuff
}
一位相当年长的同事告诉我不要这样做,但我不明白为什么。有谁知道将响应或请求对象传递给助手可能会出现的任何问题?我想不出任何答案,google 没有透露任何明确的答案。
谢谢!
Does anyone know of any issues that can arise by passing the response or request objects into helpers?
是的,您可能 运行 在传递这些参数时遇到一些问题,尤其是 res
。例如,您可以 res.send
多次(每个函数中一次),这将引发异常。
场景
一个更具体的例子是这个
routeHandler((req, res) => {
helperOne(req, res);
helperTwo(req, res);
});
根据某些情况,我想停止 return 来自 helperOne
的错误,而不去执行来自 helperTwo
的任何代码。我对这些函数的定义是这样的
helperOne = (req, res) => {
const dataPoint = req.body.dataPoint; // a number for example
if (number > 10) {
return res.send("This is not valid. Stopping here...");
} else {
console.log("All good! Continue..");
}
}
helperTwo = (req, res) => {
res.send("Response from helperTwo");
}
然后假设我有 req.body.dataPoint = 10
,现在我希望我的 routeHandler
在 if
语句的第一个块中的 return res.send
之后停止在 helperOne
.
虽然这不会按预期工作,因为 return
将只涉及 helperOne
,即 returning 函数。换句话说,它不会传播到routeHandler
。
最后将引发异常,因为 routeHandler
将调用 helperTwo
并尝试再次发送响应 。
解决方案
- 不要发送
req
或res
。只需传递您需要的数据并在 main 处理程序 中处理响应
- 更好的选择是使用 Express middlewares。由于您有多个 “顺序” 处理程序,您可以链接多个中间件,这更接近标准 Express.JS 方式
避免这样做的一个原因是您将辅助函数与 routeHandler
紧密耦合,并鼓励辅助函数的复杂性。如果您拆分辅助函数,使它们只承担单一职责,那么您很可能只需要传递请求的一个子集。
你为什么要传入 res
,你是从助手内部发送响应吗?在不知道您的 routeHandler
实现细节的情况下,我会看看您是否可以处理助手中的逻辑,但让它们每个 return 一个值并在主 routeHandler
中保持响应发送功能。这是一个简单的例子:
handleRoute('/users/:userID', (req, res) => {
const { userID } = req.params;
const idIsValid = validateUserID(userID);
if (!idIsValid) {
return res.status(400).send('Invalid user ID!');
}
...
});