在快递中,我有一个用于路线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
}
相当老的同事告诉我不要这样做,但是我不明白为什么。有谁知道通过将响应或请求对象传递给助手而可能引起的任何问题?我想不出什么,谷歌也没有透露任何明确的答案。
谢谢!
答案 0 :(得分:2)
有人知道将响应或请求对象传递给帮助程序会导致什么问题吗?
是的,您在传递这些参数时可能会遇到一些问题,尤其是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
语句的第一段中的if
之后停止{1}}。
这将无法正常工作,因为helperOne
仅涉及返回函数return
。换句话说,它不会传播到helperOne
。
最后会引发异常,因为routeHandler
将呼叫routeHandler
并尝试再次发送响应。
helperTwo
或req
。只需传递所需数据并在 main 处理程序答案 1 :(得分:1)
避免这样做的一个原因是,您将助手功能紧密地耦合到res
,并鼓励了助手中的复杂性。如果您将助手功能分解为仅负责一个功能,则可能只需要传递一部分请求即可。
您为什么要传递routeHandler
,是从助手内部发送回复?在不知道您的res
实现的细节的情况下,我会看一下您是否可以在助手中处理逻辑,但是让它们各自返回一个值并将响应发送保留在主routeHandler
函数中。这是一个简单的示例:
routeHandler