使用异步操作向REST查询发送流式响应

时间:2016-10-04 15:53:04

标签: node.js rest express streaming

更新: 澄清和编辑代码以反映我真正想要的内容,即发送流式响应,即,当他们从自己的async匹配流程到达时,发回匹配的结果。

考虑(使用expressjs - ish code)

app.post('/', jsonParser, function (req, res) {
    if (!req.body) return res.sendStatus(400)

    // matches is not needed for this scenario so
    // commenting it out
    // var matches = [];
    req.body.forEach(function(element, index) {

        foo.match(
            element, 
            function callback(error, result) {
                if (error) {
                    console.log(error); // on error 
                }
                else {
                    ⇒ if (some condition) {
                        // matches.push(result);
                        ⇒ res.send(result);
                    }
                }
            }
        );
    });

    // moved this above, inside the callback
    // ⇒ res.send(matches);

});

post('/')的输入是一系列术语。每个字词都使用foo进行匹配,每次调用后都会callback。我想发回所有满足"某些条件" (参见上面代码中的)。理想情况下,最好发回流式响应,即在匹配发生时发回响应(因为foo.match()每个术语可能需要一段时间)。我该怎么做?

1 个答案:

答案 0 :(得分:1)

这样的事情对你有用吗?我'我使用了stream-array模块。这可能对你有帮助吗? How to emit/pipe array values as a readable stream in node.js?

var streamify = require('stream-array');

app.post('/', jsonParser, function (req, res) {
  if (!req.body) {
    return res.sendStatus(400);
  }

  var matches = [];
  req.body.forEach(function (element, index) {
    foo.match(
      element,
      function callback(error, result) {
        if (error) {
          console.log(error); // on error 
        } else {
          if (some condition) {
            streamify([result]).pipe(res);
          }
        }
      }
    );
  });

  // res.json(req.body);
});