【问题标题】:How to pipe a HTTPS get response into an Object如何将 HTTPS 获取响应通过管道传输到对象中
【发布时间】:2020-06-22 16:26:32
【问题描述】:

我转换了我的代码,以便不需要额外的 node_modules,我可以只使用一些 HTTPS GET 请求,问题是当我尝试管道 /releases/ 这基本上是一个原始 JSON 文件时,我的代码需要它回来并且出现像SyntaxError: Unexpected end of JSON input 这样的问题,因为由于某种原因,当我 console.log() 所谓的 JSON 数组时,结尾没有用 ] 或 } 完成。所以我尝试将响应传送到一个数组中,但现在我得到一个错误:dest.on isn't a function,

代码:

    https.get({hostname: `api.github.com`, path: `/repos/${username}/${reponame}/releases`, headers: {'User-Agent': 'a user agent'}}, async (response) => {
        var file = new Array()
        response.pipe(file)
        response.on('end', async function() { //issue occurs at response.pipe ???
        var releases = JSON.parse(fs.readFileSync('./releases.json', 'utf8'))
        console.log(releases)

我从 Github 访问的 JSON 文件如下所示:https://api.github.com/repos/davidmerfield/randomColor/releases(随机存储库)

但是,我的文件 (releases.json) 看起来像 this

编辑:我进行了广泛的测试。我使用了我的 pkg 输出的相同 JSON 文件,使用 fs 等读取它,一切似乎都很好。所以问题很可能是 https / response

【问题讨论】:

    标签: javascript node.js json https get


    【解决方案1】:

    我发现了如何将 HTTP 请求通过管道传输到对象中,而不是通过管道将其传输到文件中。感谢这个post。我这样做并将字符串转换为 JSON 数组。

    https.get({hostname: `api.github.com`, path: `/repos/${username}/${reponame}/releases`, headers: {'User-Agent': 'agent'}}, async response => {
            var str = ''
            response.on('data', (data) => {
                str += data
            })
            response.on('end', async function() {
            var releases = JSON.parse(str)
    //and so on...
    

    【讨论】:

      【解决方案2】:

      您可以require JSON 文件。所以,如果你需要这个文件,你可以这样做:

      const releases = require('./releases.json');
      

      你不需要用 fs 读它,除非你真的想读。

      【讨论】:

      • 当我这样做调用文件时,它说文件有一个 SyntaxError 即使当我打开文件时,它也完全没问题。这可能与 https 将其作为完全一行 JSON 传递到 JSON 文件有关
      • 您必须向我们展示 JSON 以帮助我们解决此问题。这听起来像是一个格式错误的 JSON 字符串。
      • 这是一个 pastebin 链接:pastebin.com/72sXLxM6,我用它编辑了我的帖子,这是一个 looong 行的 JSON。我的另一个存储库只有 4 个版本,因此要短得多。
      【解决方案3】:

      TypeError: dest.on 不是函数

      如果您尝试通过管道传输到不可写的 Stream 对象,则会引发此错误。 Check here

      在这种情况下,Array 不是可写流。您可以使用fs.createWriteStream() 创建一个可写流并将响应通过管道传递给它。

      https.get(
        { hostname: `api.github.com`, path: `/repos/${username}/${reponame}/releases`, headers: { "User-Agent": "a user agent" } },
        async response => {
          const writableStreamFile = fs.createWriteStream("./releases.json");
          response.pipe(writableStreamFile);
          response.on("end", async function() {
            var releases = JSON.parse(fs.readFileSync("./releases.json", "utf8"));
            console.log(releases);
          });
        }
      );
      
      
      

      【讨论】:

      • 导致UnhandledPromiseRejectionWarning: SyntaxError: Unexpected end of JSON input,这发生在JSON.parse 代码中
      • 不太确定,但可能是 javascript 异步执行的问题,请尝试在 close 而不是 end 上读取文件。 IO 操作往往需要时间。
      猜你喜欢
      • 2013-04-25
      • 2019-05-23
      • 2021-08-04
      • 2016-03-06
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多