質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

1回答

1093閲覧

JSONデータをparseしたものをログに表示させるとエラーが発生する

maskmelon

総合スコア63

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2020/06/22 20:19

編集2020/06/22 20:22

前提・実現したいこと

書籍apiから検索結果を取得する。
検索単語を入力してボタンを押すと、コンソールログに検索結果のオブジェクトが表示される。

発生している問題・エラーメッセージ

SyntaxError: Unexpected end of JSON input at JSON.parse (<anonymous>) at IncomingMessage.<anonymous>

該当のソースコード

javascript

1'use strict' 2 3const express = require('express'); 4const https = require("https"); 5const bodyParser = require("body-parser"); 6 7const app = express(); 8 9app.use(express.static('public')); 10app.use(bodyParser.urlencoded({ extended: true })); 11 12app.get("/", function(req, res) { 13 res.sendFile(__dirname + "/public/index.html") 14}); 15 16app.post("/", function(req, res) { 17 const query = req.body.searchWord; 18 const url = `https://www.googleapis.com/books/v1/volumes?q=${query}` 19 20 https.get(url, function(response) { 21 console.log(response.statusCode); 22 23 response.on("data", function(data) { 24 const result = JSON.parse(data || "null"); 25 console.log(result); 26 }) 27 }) 28}) 29 30app.listen(3000, function() { 31 console.log("Server is running."); 32});

試したこと

ステータスコードを表示させると200が返ってくるのでデータ自体は取得できているはずなのですが、JSON.parseの部分で問題が生じているようです。

JSON.parse(data || "null")と書き換えても解決しませんでした。

分かる方いらっしゃいましたらよろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

JSON.parse(data || "null")と書き換えても解決しませんでした

ご質問のコード内の仮引数 data は JSON全体ではなく、通信の過程で受け取るJSONの一部分になります。
chunk:チャンクと命名する人もいます)


HTTPS モジュールは HTTPモジュールに似た実装なので、公式ドキュメント Http#get()の「JSON fetching example:」として示されるサンプルコードを参考にしてください。

サンプルコードから読み取れるのは、

  1. (受け取るJSONデータのサイズが大きいときは特に、一度に全体を受信できないので)JSONを分割して少しずつ受け取る実装になっている。 data イベントが複数回発火して、受け取った一部分がコールバック関数に渡される。
  2. 全ての受信を終えると end イベントが発火し、rawData に構築されたJSONデータを利用できる。

※ dataイベント用のコールバック関数と、endイベント用のコールバック関数の両方から参照できるスコープ上にrawDataが宣言されています。

追記)

ステータスコードを表示させると200が返ってくるのでデータ自体は取得できているはずなのですが

厳密には違います。

HTTP通信におけるデータは「HTTPヘッダ+空行+HTTPボディ」となります。
HTTPヘッダは受け取ったが、HTTPボディは読み込み中の状態と考えます。

投稿2020/06/22 21:04

編集2020/06/22 21:22
AkitoshiManabe

総合スコア5432

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maskmelon

2020/06/25 21:59 編集

いつも分かりやすい回答をありがとうございます。JSONデータの一部をオブジェクトに変換しようとしていたことが原因だったのですね。公式ドキュメントを参考に、rawDataにchunkを付け加えていき、endイベントが発火したところでparseするとうまくいきました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問