有什么理由不将请求/响应作为参数传递?

时间:2019-02-13 00:15:16

标签: javascript node.js express request response

在快递中,我有一个用于路线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
}

相当老的同事告诉我不要这样做,但是我不明白为什么。有谁知道通过将响应或请求对象传递给助手而可能引起的任何问题?我想不出什么,谷歌也没有透露任何明确的答案。

谢谢!

2 个答案:

答案 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,现在我希望routeHandlerreturn res.send语句的第一段中的if之后停止{1}}。

这将无法正常工作,因为helperOne仅涉及返回函数return。换句话说,它不会传播到helperOne

最后会引发异常,因为routeHandler将呼叫routeHandler并尝试再次发送响应。

解决方案

  • 请勿发送helperTworeq。只需传递所需数据并在 main 处理程序
  • 中处理响应
  • 一个更好的选择是使用Express middlewares。由于您具有多个“顺序” 处理程序,因此可以链接多个中间件,这与标准Express.JS方法更接近

答案 1 :(得分:1)

避免这样做的一个原因是,您将助手功能紧密地耦合到res,并鼓励了助手中的复杂性。如果您将助手功能分解为仅负责一个功能,则可能只需要传递一部分请求即可。

您为什么要传递routeHandler,是从助手内部发送回复?在不知道您的res实现的细节的情况下,我会看一下您是否可以在助手中处理逻辑,但是让它们各自返回一个值并将响应发送保留在主routeHandler函数中。这是一个简单的示例:

routeHandler