【问题标题】:Expressjs higher order router vs appending to requestExpressjs 高阶路由器与附加到请求
【发布时间】:2020-05-05 15:01:42
【问题描述】:

假设我想向 ExpressJS 路由回调传递一个对象。

我知道我可以追加到app:

// router.js
const getFoo = (req, res) => res.json(req.app.foo);

// index.js
const app = express();
app.foo = {};
app.get('/foo', getFoo);

或者我可以使用更高阶的函数:

// router.js
const getFoo = foo => (req, res) => res.json(foo);

// index.js
const app = express();
const foo = {};
app.get('/foo', getFoo(foo));

两者都易于编写、扩展和测试。 但是,我不知道解决方案的含义以及是否更好。

有人知道这两种方法之间的真正区别吗?

【问题讨论】:

    标签: node.js express functional-programming higher-order-functions


    【解决方案1】:

    我认为第二种解决方案更正确,原因如下。

    想象你习惯了第一个解决方案,有一天你需要发送一个名为 post 或 get 或任何名称为 app 属性的东西,你忘记了已经有一个这样命名的属性,所以你在没有意识到的情况下覆盖了原始属性,当你调用app.post()时程序会崩溃。

    相信我,您不希望将数小时的研究浪费在类似的事情上,并意识到您只是覆盖了原始方法

    另外,在我看来,改变不是由你生成的原始对象总是一个坏主意

    【讨论】:

      【解决方案2】:

      正如@vahe-yavrumian 所说,改变第三方库创建的对象的状态并不是一个好主意。

      您还可以使用app.get() 和app.set() 方法将任何数据传递给队列中的其他路由器(似乎这些方法只是为了这个目的。)

      更多信息请访问https://expressjs.com/en/api.html。

      【讨论】:

        【解决方案3】:

        如果您发现需要这样做,第二个解决方案可以轻松地让您在不同的路由上为 foo 传递不同的值。

        第一个解决方案基本上将值放在app 单例上,这具有使用单例的所有含义。 (正如@Anees 所提到的,对于 express,特别是带有 get 和 set 的 app 设置是存储它的合适位置,而不是自定义属性)

        【讨论】:

          猜你喜欢
          • 2022-11-02
          • 1970-01-01
          • 2015-12-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-12-16
          • 2020-04-12
          相关资源
          最近更新 更多