gpt4 book ai didi

javascript - 从 Node.JS 中的两个网站请求 RSS 提要

转载 作者:搜寻专家 更新时间:2023-10-31 22:56:27 25 4
gpt4 key购买 nike

我有一个从两个 Web 服务器请求数据的 Node.JS 服务器:bbc.co.uksky.com .然后解析 RSS 提要,用户会看到两个列表:来自 BBC 和来自天空。

这是代码。

var feed = require('feed-read');
var http = require('http');
var async = require('async');
var request = require('request');

var LIMIT = 10;
var UNABLE_TO_CONNECT = "Unable to connect.";
var BBC_URL = 'http://feeds.bbci.co.uk/news/rss.xml';
var SKY_URL = 'http://news.sky.com/feeds/rss/home.xml';

var server = http.createServer(onRequest);
server.listen(9000);

function onRequest(req, res) {
res.writeHead(200, {
'Content-Type' : 'text/html; charset=utf-8'
});

async.parallel([ function(callback) {
feed(BBC_URL, onRssFetched);
// TODO: where to call callback()?
}, function(callback) {
feed(SKY_URL, onRssFetched);
// TODO: where to call callback()?
} ], function done(err, results) {
console.log("Done");
if (err) {
throw err;
}
});
}

function onRssFetched(err, articles) {
console.log("RSS fetched");
var html = [];
if (err) {
html.push("<p>", UNABLE_TO_CONNECT = "</p>");
} else {
html.push("<ol>");
var i = 0;
articles.forEach(function(entry) {
if (i == LIMIT) {
return;
}
html.push("<li><a href='" + entry.link + "'>" + entry.title
+ "</a></li>");
i++;
});
}
console.log(html.join(""));
}

现在我不知道如何将结果添加到网页中。如果我在调用 feed 方法后立即调用 callback()callback() 将被执行,而不会等到 feed 已经完成了它的工作。另一方面,我无法将 callback 传递给 feed。也许方法不对,我需要一些其他模块来进行 RSS 解析。

最佳答案

@Maksim 我知道你最初的问题包括 async 模块,但提出一个替代方案:

为什么不 流式传输 每篇文章 到客户端,而不是等待 所有 RSS 提要在发送响应之前返回...?

通过使用 async.parallel 你告诉 Node :

"wait until we have a response from all these news services
and only
then (combine the articles into) a single response to the client ..."

这会在您等待所有响应(来自 RSS 新闻服务)时为每个连接的客户端耗尽内存……浪费

所以我在没有诉诸异步的情况下写下了我的答案。
而且,不是等待 ages(async 将所有提要合并为一个),
第一个 rss 提要一返回,客户就会看到新闻!

var feed = require('feed-read'),  // require the feed-read module
http = require("http"),
urls = [
"http://feeds.bbci.co.uk/news/rss.xml",
"http://news.sky.com/feeds/rss/home.xml",
"http://www.techmeme.com/feed.xml"
]; // Example RSS Feeds

http.createServer(function (req, res) {
// send basic http headers to client
res.writeHead(200, {
"Content-Type": "text/html",
"Transfer-Encoding": "chunked"
});

// setup simple html page:
res.write("<html>\n<head>\n<title>RSS Feeds</title>\n</head>\n<body>");

// loop through our list of RSS feed urls
for (var j = 0; j < urls.length; j++) {

// fetch rss feed for the url:
feed(urls[j], function(err, articles) {

// loop through the list of articles returned
for (var i = 0; i < articles.length; i++) {

// stream article title (and what ever else you want) to client
res.write("<h3>"+articles[i].title +"</h3>");

// check we have reached the end of our list of articles & urls
if( i === articles.length-1 && j === urls.length-1) {
res.end("</body>\n</html>"); // end http response
} // else still have rss urls to check
} // end inner for loop
}); // end call to feed (feed-read) method
} // end urls for loop
}).listen(9000);

主要优势:

  • 连接到您的应用程序的人将更快地(几乎是即时的!)看到新闻/结果
  • 您的应用使用很多更少的内存
  • 添加新的 RSS 新闻提要时,您无需编辑/更新任何代码!

For even more detail/notes on this solution
see: https://github.com/nelsonic/node-parse-rss

关于javascript - 从 Node.JS 中的两个网站请求 RSS 提要,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20177259/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com