过滤请求管道Node.js

时间:2016-02-26 08:02:11

标签: javascript node.js httprequest

我是Node.js的新手,我正在练习使用文件流和请求。我写了一个程序,获取reddit论坛的HTML并过滤它以获得所有帖子的标题。我的代码如下所示:

var request = require('request');
var http = require('http');
var fs = require('fs');

var server = http.createServer();

server.on('request', function(req, response){
    var matches = [];
    var desination = fs.createWriteStream("posts.txt");
    request('https://www.reddit.com/r/TagPro/top/?sort=top&t=all', function (error, response, body) {
        if (!error && response.statusCode == 200) {
            var re = /tabindex="1" >(.+?)</g;
            var match;
            while (match = re.exec(body)) {
                matches[matches.length] = match[1];
            }
        }
    }).pipe(response);

});

server.listen(8080)

基本上,数组matches包含已过滤的信息,我正在尝试将其内容传递给服务器请求的响应。

现在我的代码将整个html管道传递给响应,但我想知道我是否可以管道我的数组的内容,所以只写出有用的信息。

2 个答案:

答案 0 :(得分:1)

您实际上处理了两次响应:使用回调(在其中提取匹配项),方法是将其连接到HTTP响应(未更改)。

相反,你应该选择其中一个。最简单的方法是根本不管道数据,只需在累积所有匹配项后发回(JSON)响应:

server.on('request', function(req, res) {
  var matches = [];
  request('https://www.reddit.com/r/TagPro/top/?sort=top&t=all', function (error, response, body) {
    // Handle errors properly.
    if (error || response.statusCode !== 200) {
      return res.writeHead(error ? 500 : response.statusCode);
    }

    // Accumulate the matches.
    var re = /tabindex="1" >(.+?)</g;
    var match;
    while (match = re.exec(body)) {
      matches[matches.length] = match[1];
    }

    // Send back the array as JSON.
    res.setHeader('content-type', 'application/json');
    res.end(JSON.stringify(matches));
  });
});

(注意我将响应对象重命名为res以防止它被response回调的request参数破坏

答案 1 :(得分:0)

您可以在每次匹配时调用response.write(),而在完成时调用response.end(取决于每个匹配与前一个匹配正确,以便总响应全部响应)正确的分隔符 - 我不确定每场比赛中的内容是什么),或者您可以在一次response.end()来电中发送整套比赛。你做的事情取决于你期望的匹配数量。