【问题标题】:ReactiveX Observable from NodeJS Express 'post'来自 NodeJS Express 'post' 的 ReactiveX Observable
【发布时间】:2017-06-19 00:13:57
【问题描述】:

是否可以从以下位置创建 ReactiveX Observable:

app = express();
app.post('/path', function() {...})

?

我的意思是,有一种方法可以创建一个可观察的fromEvent,我已经在其中使用了很多使用object.on('eventName', function(){}) 注册的事件,但来自 express 的帖子并不完全一样。

【问题讨论】:

    标签: node.js express asynchronous rxjs reactive-programming


    【解决方案1】:

    Rx-ify 一路快递?

    尝试将 express 中路由的回调样式实现转换为 Rx 所增加的复杂性使我得出结论,这不是前进的方向。这是因为 express 不知道 Rx,因此没有订阅生命周期和多事件发射的概念。

    martin 的答案是一个概念验证,你可以在其中清楚地看到上述问题。这意味着对于每条路线,您需要创建一个单独的Subjectshare() 一个主题,然后为每条路线制作大量过滤器以分离实现。这是冗余,因为 express 已经将您的请求路由到正确的处理程序。

    将 Rx 世界与快速回调结合起来

    如果您想获得 Expressjs 路由与 RxJs 结合的好处,我会将路由逻辑分开并将其保留在 express 回调中,实际实现将其用作 Rx 并结合 .toPromise() 来激活它:

    app.post('/user/:id', (req, res) => {
      return getUserById(req.params.id)
        .toPromise()/* return the Rx stream as promise to express so it traces its lifecycle */
        .then(
          user => res.send(user),
          err => res.status(500).send(err.message)
        );
    });    
    
    function getUserById(id) {
      // stub implementation
      return Rx.Observable.of({ id, name: 'username' }) 
        .delay(100);
    }
    

    【讨论】:

      【解决方案2】:

      我认为最简单的方法是使用Subjectexpress 重新发送事件。

      var express = require('express');
      var Rx = require('rxjs');
      var app = express();
      
      let subject = new Rx.Subject();
      
      app.get('/', (req, res) => subject.next([req, res]));
      
      subject
        .do(a => console.log('123345'))
        .subscribe(args => {
          let [req, res] = args;
          res.send('Hello World!');
        });
      
      app.listen(3000, function () {
        console.log('Example app listening on port 3000!')
      });
      

      主要区别在于您需要将[req, res] 包装为一个数组,因为您希望将两者都传递给subject.next(...)。稍后可以使用 let [req, res] = args; 解压缩。

      很遗憾,您不能使用 Observable.bindCallback,因为它只需要来自包装函数的单个响应,然后完成,这就是您现在在这种情况下想要的。

      【讨论】:

      • 为什么 let 而不是 var?
      • 我也得到了那个 subject.next 不是函数
      • 应该是'onNext'
      • 不,在 RxJS 5 中,该方法仅称为 next()。诸如 onNext() 之类的名称在较旧的 RxJS 4 中使用。
      猜你喜欢
      • 1970-01-01
      • 2018-03-12
      • 1970-01-01
      • 1970-01-01
      • 2016-02-25
      • 2019-07-17
      • 2016-03-19
      • 2018-08-22
      • 1970-01-01
      相关资源
      最近更新 更多