2

私は、Google Cloudの機能を使ってAPI上でランダムなWikipediaページを取得しようとしました。 Wikipedia APIはうまく動作します。あなたは、ブラウザで結果を確認中jsonfmする形式を変更することができますテストのためにクラウド機能からランダムなwikiページを取得

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

:これは私の要求です。 Click here

しかし、リクエストが完全に成功する前でも自分の機能が破壊されているようです。私は(または私はそのデータをログに記録したい場合でも)データを解析したい場合は、私はその(例えば)などの

SyntaxError: Unexpected end of json 

ログを見て(いいえ、私は自分でそれをカットしていない)だ:

DATA:UE || "}、" クエリ ":{" ページ ":{" 2855038 ":{" たpageID ":2855038、" NS ":0、" タイトル ":" トーマス・フィッシャー

もちろん、これは有効な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を返すことができます。しかし、私はそれでも成功していません。

どのようにそれは私の期待を返すというのが私の機能を見ている:

{ "タイトル": "ランダムウィキペディアページタイトル"}

答えて

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(); 
}; 
+1

うわー。それは速かった。ありがとう、それは動作します。 'let wikiResponseData;'を編集して 'let wikiResponseData =" ";'にすることができますか?さもなければ、 'wikiResonseData'は' undefined {THE_JSON_DATA} ' – StefMa

+0

に変更されます。私はストリームで混乱して以来、ごめんなさい –

関連する問題