从云函数中获取随机Wiki页面

时间:2017-06-26 06:22:58

标签: json node.js express google-cloud-platform google-cloud-functions

我试图通过Google Cloud Functions在他们的API上获得随机的Wikipedia页面。 Wikipedia API工作正常。这是我的要求:

  

https://de.wikipedia.org/w/api.php?action=query&format=json&generator=random

对于测试,您可以将格式更改为jsonfm,在浏览器中查看结果。 Click here

但似乎我的功能甚至在请求完全成功之前就被破坏了。如果我想解析数据(或者即使我想记录那些数据),我得到了一个

SyntaxError: Unexpected end of json

日志看起来像(例如)(我自己没有把它自己剪掉):

  

DATA:ue ||"},"查询":{"页面":{" 2855038":{" pageid&# 34;:2855038," ns":0," title":" Thomas Fischer

当然,这不是一个有效的json,无法解析。无论这是我的功能:

exports.randomWikiPage = function getRandomWikiPage (req, res) {
  const httpsOptions = {
    host: "de.wikipedia.org",
    path: "/w/api.php?action=query&format=json&generator=random"
  };

  const https = require('https');
  https.request(httpsOptions, function(httpsRes) {
    console.log('STATUS: ' + httpsRes.statusCode)
    console.log('HEADERS: ' + JSON.stringify(httpsRes.headers))
    httpsRes.setEncoding('utf8')
    httpsRes.on('data', function (data) {
      console.log("DATA: " + data)
      const wikiResponse = JSON.parse(data);

      const title = wikiResponse.query.title
      res.status(200).json({"title": title})
    });
  }).end();
};

我已经尝试过回复一些东西了。像that video解释的那样。但是当我查看节点文档https.request时,不要返回Promise。所以回归是错的。我还尝试将on('data', callback)提取到自己的function中,以便我可以返回callback。但我也没有成功。

如何查看我的函数,它返回我的预期:

  

{" title":"随机的维基百科页面标题"}

1 个答案:

答案 0 :(得分:2)

我相信你的json是以块状流的形式出现的。您正在尝试解析返回的第一个数据块。尝试类似:

  https.request(httpsOptions, function(httpsRes) {
    console.log('STATUS: ' + httpsRes.statusCode)
    console.log('HEADERS: ' + JSON.stringify(httpsRes.headers))
    httpsRes.setEncoding('utf8')
    let wikiResponseData = '';
    httpsRes.on('data', function (data) {
      wikiResponseData += data;
    });
    httpRes.on('end', function() {
      const wikiResponse = JSON.parse(wikiResponseData)
      const title = wikiResponse.query.title
      res.status(200).json({"title": title})
    })
  }).end();
};