Express 服务器上的 RSS 订阅实现
RSS subscription implementation on express server
我正在设置一个订阅 RSS 提要的 node.js 服务器。当一个新项目发布到提要时,我希望服务器解析该信息并将其传递给 API 以提醒最终用户。我可以使用 feedparser 作为订阅者吗?
我知道这个库创建了一个 EventEmitter 来触发动作。是否可以导出此函数并使其 运行 与我的 Express 应用程序并行?
摘自解析器示例:
const FeedParser = require('feedparser')
const request = require('request')
const subscriber = async () => {
const req = request('https://www.reddit.com/.rss')
const feedparser = new FeedParser()
req.on('error', (error) => {
console.log(error)
})
req.on('response', (r) => {
const stream = this
if (r.statusCode !== 200) {
this.emit('error', new Error('bad status code'))
} else {
stream.pipe(feedparser)
}
})
feedparser.on('readable', () => {
// This is where the action is!
const stream = this
var item = ''
while (item = stream.read()) {
console.log(item)
}
})
return feedparser
}
module.exports = {
subscriber
}
当我调用此函数时,我希望控制台记录新项目,但我没有收到任何项目。原因不明。
奖金问题:我可以验证订阅是否有效而不必等待新项目发布吗?是否有可以模拟该行为的 RSS 工具或网站?
我学到了一些东西:
- RSS Feeds 不发送信息。如果你想订阅一个,你需要在一个时间间隔发出请求并解析新信息:Subscribe to an RSS Feed
- 任何不需要处理传入请求的功能可能不需要在您的 Express 中间件中使用,您可以立即开始 RSS 订阅间隔 before/after 启动您的 HTTP 服务器:
var app = require('../app');
var http = require('http');
var port = normalizePort(process.env.PORT || '3000');
app.set('port', port);
/**
* Create HTTP server.
*/
var server = http.createServer(app);
/**
* Listen on provided port, on all network interfaces.
*/
server.listen(port);
server.on('error', onError);
server.on('listening', onListening);
/**
* Start the subscriber
*/
var feed = new RssFeed({your rss feed url}, 60000); // 60000 = 60 second refresh rate
feed.start();
还包括我的实施的不完整片段:
const Parser = require('rss-parser')
class RssSubscriber extends Parser {
constructor (url, interval) {
super()
this.url = url
this.interval = interval
this.latestPublishTime = null
}
start () {
// execute on an interval
setInterval(async () => {
try {
console.log('Fetching feed...')
const news = await this.parseFeed()
await Promise.all(news.map(n => { return this.alert(n) }))
} catch (err) {
console.log('WARN: Error Encountered when fetching subscription items.')
}
}, this.interval)
}
我正在设置一个订阅 RSS 提要的 node.js 服务器。当一个新项目发布到提要时,我希望服务器解析该信息并将其传递给 API 以提醒最终用户。我可以使用 feedparser 作为订阅者吗?
我知道这个库创建了一个 EventEmitter 来触发动作。是否可以导出此函数并使其 运行 与我的 Express 应用程序并行?
摘自解析器示例:
const FeedParser = require('feedparser')
const request = require('request')
const subscriber = async () => {
const req = request('https://www.reddit.com/.rss')
const feedparser = new FeedParser()
req.on('error', (error) => {
console.log(error)
})
req.on('response', (r) => {
const stream = this
if (r.statusCode !== 200) {
this.emit('error', new Error('bad status code'))
} else {
stream.pipe(feedparser)
}
})
feedparser.on('readable', () => {
// This is where the action is!
const stream = this
var item = ''
while (item = stream.read()) {
console.log(item)
}
})
return feedparser
}
module.exports = {
subscriber
}
当我调用此函数时,我希望控制台记录新项目,但我没有收到任何项目。原因不明。
奖金问题:我可以验证订阅是否有效而不必等待新项目发布吗?是否有可以模拟该行为的 RSS 工具或网站?
我学到了一些东西:
- RSS Feeds 不发送信息。如果你想订阅一个,你需要在一个时间间隔发出请求并解析新信息:Subscribe to an RSS Feed
- 任何不需要处理传入请求的功能可能不需要在您的 Express 中间件中使用,您可以立即开始 RSS 订阅间隔 before/after 启动您的 HTTP 服务器:
var app = require('../app');
var http = require('http');
var port = normalizePort(process.env.PORT || '3000');
app.set('port', port);
/**
* Create HTTP server.
*/
var server = http.createServer(app);
/**
* Listen on provided port, on all network interfaces.
*/
server.listen(port);
server.on('error', onError);
server.on('listening', onListening);
/**
* Start the subscriber
*/
var feed = new RssFeed({your rss feed url}, 60000); // 60000 = 60 second refresh rate
feed.start();
还包括我的实施的不完整片段:
const Parser = require('rss-parser')
class RssSubscriber extends Parser {
constructor (url, interval) {
super()
this.url = url
this.interval = interval
this.latestPublishTime = null
}
start () {
// execute on an interval
setInterval(async () => {
try {
console.log('Fetching feed...')
const news = await this.parseFeed()
await Promise.all(news.map(n => { return this.alert(n) }))
} catch (err) {
console.log('WARN: Error Encountered when fetching subscription items.')
}
}, this.interval)
}