簡體   English   中英

如何訪問通過管道傳遞到feedparser的請求的響應標頭

[英]How can I access the response headers of a request that is piped to a feedparser

我正在嘗試使用請求js和feedparser承諾的庫來解析RSS feed。 我可以使用以下代碼解析供稿。

import Bottleneck from 'bottleneck';

const feedparser = require('feedparser-promised');
const limiter = new Bottleneck({
  maxConcurrent: 1,
  minTime: 333,
});

const httpOptions = {
      uri: val.sourcefeedurl,
      resolveWithFullResponse: true,
      method: 'GET',
      pool: false,
      headers: {
        'If-None-Match': val.etag,
        'If-Modified-Since': val.LastModified,
        Connection: 'keep-alive',
        ciphers: 'DES-CBC3-SHA',
      },
    };
const response = await limiter.schedule(() => feedparser.parse(httpOptions));

但是,由於我使用feedparser承諾的庫,因此無法從響應標頭緩存etag和Last Modified。

我試圖像這樣修改feedparser-promised

'use strict';

const request = require('request');

const feedParser = require('./feedParser');

const parse = (requestOptions, feedparserOptions) => {
  const metaData = {};
  return new Promise((resolve, reject) => {
    request.get(requestOptions).on('error', reject).on('response', async resp => {
      if (resp.statusCode === 304) {
        reject('Source not modified');
      } else if (resp.statusCode === 200) {
        metaData.etagin = await resp.headers.etag;
        metaData.LastModifiedin = await resp.headers['last-modified'];
        metaData.LastModifiedLocal = await resp.headers['last-modified'];
        // console.log(metaData);
      }
    }).pipe(feedParser(feedparserOptions).on('error', reject).on('response', resolve));
  });
};

module.exports = {
  parse
};

以下是feedParser文件

'use strict';

const FeedParserStream = require('feedparser');

module.exports = (feedparserOptions, metaData) => {
  // console.log(metaData, 'herre');
  const parsedItems = [];
  const feedparser = new FeedParserStream(feedparserOptions);
  // console.log(feedparser);
  feedparser.on('readable', () => {
    // console.log(resp);
    let item;
    while (item = feedparser.read()) {
      parsedItems.push(item);
    }

    return parsedItems;
  }).on('end', function next() {
    this.emit('response', parsedItems);
  });
  return feedparser;
};

所以我的問題是,在解決承諾的同時,如何返回響應標頭以及parsedItems(如代碼中所示)。

非常感謝您的幫助。

像這樣最終傳遞metaData

'use strict';

const FeedParserStream = require('feedparser');

module.exports = (feedparserOptions, metaData) => {
  // console.log(metaData, 'herre');
  const parsedItems = [];
  const feedparser = new FeedParserStream(feedparserOptions);
  // console.log(feedparser);
  feedparser.on('readable', () => {
    // console.log(resp);
    let item;
    while (item = feedparser.read()) {
      parsedItems.push(item);
    }

    return parsedItems;
  }).on('end', function next() {
    this.emit('response', { parsedItems, metaData });
  });
  return feedparser;
};

而您的供稿解析器承諾為

'use strict';

const request = require('request');

const feedParser = require('./feedParser');

const parse = (requestOptions, feedparserOptions) => {
  const metaData = {};
  return new Promise((resolve, reject) => {
    request.get(requestOptions).on('error', reject).on('response', async resp => {
      if (resp.statusCode === 304) {
        reject('Source not modified');
      } else if (resp.statusCode === 200) {
        metaData.etagin = await resp.headers.etag;
        metaData.LastModifiedin = await resp.headers['last-modified'];
        metaData.LastModifiedLocal = await resp.headers['last-modified'];
        // console.log(metaData);
      }
    }).pipe(feedParser(feedparserOptions, metaData).on('error', reject).on('response', resolve));
  });
};

module.exports = {
  parse
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM