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

标签 javascript node.js express request response

在 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,我现在希望我的 routeHandlerreturn res.send 之后停止helperOne 中我的 if 语句的第一 block 中。

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

最后将引发异常,因为 routeHandler 将调用 helperTwo 并尝试再次发送响应。

解决方案

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

关于javascript - 有什么理由不将请求/响应作为参数传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54660640/

相关文章:

javascript - req.body 未由 body-parser 定义

javascript - HTML 按钮元素可以从父元素继承它的值吗?

javascript - 尝试从 json 获取字符串值时出现错误

javascript - 使用 jquery 附加的样式元素

mysql - 我应该为 Node.js 和 MySQL 使用哪个 ORM?

node.js - node/express 中的 "/register"和 "register"路由是否相同?

node.js - NodeJS Express 删除同一用户的所有 session

javascript - 使用 JQuery 将内部 html 替换为 html 时间值

javascript - Npm postinstall 仅用于开发

node.js - NodeJS/MongoDB 中集合的不同数据库