我是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管道传递给响应,但我想知道我是否可以管道我的数组的内容,所以只写出有用的信息。
答案 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()
来电中发送整套比赛。你做的事情取决于你期望的匹配数量。