在 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
}
一位资历相当高的同事告诉我不要这样做,但我不明白为什么。有谁知道将响应或请求对象传递给助手可能会出现的任何问题?我想不出任何答案,谷歌也没有透露任何明确的答案。
谢谢!
最佳答案
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);
});
根据某些情况,我想停止并从 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
在 return res.send 之后停止
在 helperOne
中我的 if
语句的第一 block 中。
但这不会像预期的那样工作,因为 return
将只涉及返回函数 helperOne
。换句话说,它不会传播到routeHandler
。
最后将引发异常,因为 routeHandler
将调用 helperTwo
并尝试再次发送响应。
解决方案
- 不要发送
req
或res
。只需传递您需要的数据并在您的主处理程序中处理响应 - 更好的选择是使用 Express middlewares .由于您有多个“顺序” 处理程序,您可以链接多个中间件,这更接近标准的 Express.JS 方式
关于javascript - 有什么理由不将请求/响应作为参数传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54660640/