如何从fetch pipe feeding sax解析器(node.js)返回解析结果

vc9ivgsu  于 2021-09-23  发布在  Java
关注(0)|答案(1)|浏览(319)

我有node.js代码,它获取xml提要,将其导入sax解析器,并将我需要的数据提取到js对象中。
最简单的代码如下所示。

const fetch = require('node-fetch')
const sax = require('sax')

function fetchAndParse(url)
{

  const saxStream = require("sax").createStream(strict, {normalize: true, trim: true})
  const desiredData = []

  saxStream.on("error", function (err) {
      ...
  }).on("opentag", function (node) {
      ...
  }).on("cdata", function(t) {
      ...
  }).on("text", function(t) {
      ...
  }).on("closetag", function (nodeName) {
      ...
  }).on("end", function() {
    console.log("END", desiredData)
  })

  fetch(url)
  .then(
    res => { res.body.pipe(saxStream) }
  )
}

理想情况下,我想把它变成一个 async 功能与使用 await 当调用它时,但目前我不知道如何在它完成时从这里获取数据,因为我唯一能够访问完成的数据的地方是 on("end") 功能。我想我错过了一些基本的东西。

mdfafbf1

mdfafbf11#

我还没有和你一起工作过 sax 所以我不完全确定它的api是什么样子的,但您应该能够返回一个承诺,该承诺可以解决您想要的数据。
类似这样的内容(注意:我没有测试这个):

const fetch = require("node-fetch");
const sax = require("sax");

function fetchAndParse(url) {
  const saxStream = require("sax").createStream(strict, {
    normalize: true,
    trim: true,
  });
  const desiredData = [];

  return new Promise((resolve, reject) => {
    saxStream
      .on("error", function (err) {
        reject(err);
      })
      .on("opentag", function (node) {
        // ...
      })
      .on("cdata", function (t) {
        // ...
      })
      .on("text", function (t) {
        // ...
      })
      .on("closetag", function (nodeName) {
        // ...
      })
      .on("end", function () {
        resolve(desiredData);
      });

    fetch(url).then((res) => {
      res.body.pipe(saxStream);
    });
  });
}

相关问题