Реализация подписки RSS на экспресс-сервере - PullRequest
4 голосов
/ 19 апреля 2019

Я настраиваю сервер node.js, который подписывается на RSS-канал.Когда новый элемент публикуется в ленте, я хочу, чтобы сервер проанализировал эту информацию и передал ее в 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 или веб-сайт, который может имитировать поведение?

1 Ответ

3 голосов
/ 30 апреля 2019

Пара вещей, которые я узнал:

  1. RSS-каналы не отправляют информацию. Если вы хотите подписаться на один из них, вам нужно делать интервалы между запросами и анализировать новую информацию: Подписаться на RSS-ленту
  2. Любая функциональность, которая не требует обработки входящих запросов, вероятно, не должна использоваться в вашем промежуточном программном обеспечении Express, вы можете просто запустить интервал подписки RSS непосредственно перед / после запуска вашего 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)
  }

...