最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

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

运维笔记admin13浏览0评论

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

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

在express中我有一个路由器的处理程序:

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
}

我被告知不要由一位相当高级的同事这样做,但我不明白为什么。有没有人知道将响应或请求对象传递给帮助者可能产生的任何问题?我想不出任何和谷歌没有透露任何明确的答案。

谢谢!

回答如下:

有没有人知道将响应或请求对象传递给帮助者可能产生的任何问题?

是的,在传递这些参数时可能会遇到一些问题,尤其是res。例如,你可以多次res.send(每个函数一个),这将引发异常。

Scenario

这是一个更具体的例子

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.sendif声明的第一个区块中的helperOne之后停止。

这不会像预期的那样工作,因为return只会涉及返回函数helperOne。换句话说,它不会传播到routeHandler

最终将引发一个例外,因为routeHandler将调用helperTwo并尝试再次发送响应。

Solution

  • 不要发送reqres。只需传递您需要的数据并处理主处理程序中的响应
  • 更好的选择是使用Express middlewares。由于您有多个“顺序”处理程序,因此您可以链接多个中间件,这更接近标准的Express.JS方式
发布评论

评论列表(0)

  1. 暂无评论