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

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

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

LINE Messaging APIは、メッセージの送信・返信ができるAPIです。Web APIを経由しアプリケーションサーバとLINEのAPIでやり取りが可能。複数のメッセージタイプや分かりやすいAPIリファレンスを持ち、グループチャットにも対応しています。

JSON

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

Node.js

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

JavaScript

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

Express

ExpressはNode.jsのWebアプリケーションフレームワークです。 マルチページを構築するための機能セットおよびハイブリッドのWebアプリケーションを提供します。

Q&A

解決済

1回答

2298閲覧

TypeError: Cannot read property '0' of undefined

退会済みユーザー

退会済みユーザー

総合スコア0

LINE Messaging API

LINE Messaging APIは、メッセージの送信・返信ができるAPIです。Web APIを経由しアプリケーションサーバとLINEのAPIでやり取りが可能。複数のメッセージタイプや分かりやすいAPIリファレンスを持ち、グループチャットにも対応しています。

JSON

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

Node.js

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

JavaScript

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

Express

ExpressはNode.jsのWebアプリケーションフレームワークです。 マルチページを構築するための機能セットおよびハイブリッドのWebアプリケーションを提供します。

0グッド

0クリップ

投稿2018/01/27 19:03

編集2018/01/28 03:23

heroku + node.js + expressでLINE Messaging APIを使ってぐるなびAPIを呼べるLINEbotを作ろうとしています。
「TypeError: Cannot read property '0' of undefined」というエラーが出て困っています。

参考にしたページ:
https://qiita.com/enta0701/items/45d5295e023e24e9ff0b

「TypeError: Cannot read property '0' of undefined」というエラーが出て困っています。

以下が書いたコードです。
※エラーを出したと思われる箇所に「<<<<エラー」と記入しています。

Node.js

1// index.js 2 3'use strict'; 4 5var express = require('express'); 6var app = express(); 7var bodyParser = require('body-parser'); 8var request = require('request'); 9var async = require('async'); 10var crypto = require('crypto'); 11var line = require('@line/bot-sdk'); 12 13console.log("app is running"); 14 15// ぐるなび 16app.set('port', (process.env.PORT || 8000)); 17app.use(bodyParser.urlencoded({extended: true})); // JSONの送信を許可 18app.use(bodyParser.json()); // JSONのパースを楽に(受信時) 19 20app.listen(process.env.PORT || 8000); 21console.log("Server is online"); 22 23app.post('/callback', function(req, res){ 24 25 console.log("post() has been called"); 26 async.waterfall([ 27 // ぐるなびAPI 28 function(callback) { 29 30 var json = req.body; 31 32 // 受信テキスト 33 var search_place = json['result'][0]['content']['text']; <<<<<エラー 34 var search_place_array = search_place.split("\n"); 35 36 //検索キーワード 37 var gnavi_keyword = ""; 38 if(search_place_array.length == 2){ 39 var keyword_array = search_place_array[1].split("、"); 40 gnavi_keyword = keyword_array.join(); 41 } 42 43 // ぐるなびAPI レストラン検索API 44 var gnavi_url = 'http://api.gnavi.co.jp/RestSearchAPI/20150630/'; 45 // ぐるなび リクエストパラメータの設定 46 var gnavi_query = { 47 // "keyid":"<ぐるなびのアクセスキー>", 48 "keyid":"-----", 49 "format": "json", 50 "address": search_place_array[0], 51 "hit_per_page": 1, 52 "freeword": gnavi_keyword, 53 "freeword_condition": 2 54 }; 55 var gnavi_options = { 56 url: gnavi_url, 57 headers : {'Content-Type' : 'application/json; charset=UTF-8'}, 58 qs: gnavi_query, 59 json: true 60 }; 61 62 // 検索結果をオブジェクト化 63 var search_result = {}; 64 65 request.get(gnavi_options, function (error, response, body) { 66 if (!error && response.statusCode === 200) { 67 if('error' in body){ 68 console.log("検索エラー" + JSON.stringify(body)); 69 return; 70 } 71 72 // 店名 73 if('name' in body.rest){ 74 search_result['name'] = body.rest.name; 75 } 76 // 画像 77 if('image_url' in body.rest){ 78 search_result['shop_image1'] = body.rest.image_url.shop_image1; 79 } 80 // 住所 81 if('address' in body.rest){ 82 search_result['address'] = body.rest.address; 83 } 84 // 緯度 85 if('latitude' in body.rest){ 86 search_result['latitude'] = body.rest.latitude; 87 } 88 // 経度 89 if('longitude' in body.rest){ 90 search_result['longitude'] = body.rest.longitude; 91 } 92 // 営業時間 93 if('opentime' in body.rest){ 94 search_result['opentime'] = body.rest.opentime; 95 } 96 97 callback(null, json, search_result); 98 99 } else { 100 console.log('error: '+ response.statusCode); 101 } 102 }); 103 104 }, 105 ], 106 107 // LINE BOT 108 function(err, json, search_result) { 109 if(err){ 110 return; 111 } 112 113 //ヘッダーを定義 114 var headers = { 115 'Content-Type' : 'application/json; charset=UTF-8', 116 'X-Line-ChannelID' : '1558387552', 117 'X-Line-ChannelSecret' : '-----', 118 'X-Line-Trusted-User-With-ACL' : '-----' 119 }; 120 121 // 送信相手の設定(配列) 122 var to_array = []; 123 to_array.push(json['result'][0]['content']['from']); 124 125 126 // 送信データ作成 127 var data = { 128 'to': to_array, 129 'toChannel': 1383378250, //固定 130 'eventType':'140177271400161403', //固定 131 "content": { 132 "messageNotified": 0, 133 "messages": [ 134 // テキスト 135 { 136 "contentType": 1, 137 "text": 'こちらはいかがですか?\n【お店】' + search_result['name'] + '\n【営業時間】' + search_result['opentime'], 138 }, 139 // 画像 140 { 141 "contentType": 2, 142 "originalContentUrl": search_result['shop_image1'], 143 "previewImageUrl": search_result['shop_image1'] 144 }, 145 // 位置情報 146 { 147 "contentType":7, 148 "text": search_result['name'], 149 "location":{ 150 "title": search_result['address'], 151 "latitude": Number(search_result['latitude']), 152 "longitude": Number(search_result['longitude']) 153 } 154 } 155 ] 156 } 157 }; 158 159 //オプションを定義 160 var options = { 161 url: 'https://trialbot-api.line.me/v1/events', 162 // proxy : process.env.FIXIE_URL, 163 proxy : '-----', 164 headers: headers, 165 json: true, 166 body: data 167 }; 168 console.log(process.env.FIXIE_URL); 169 170 request.post(options, function (error, response, body) { 171 if (!error && response.statusCode == 200) { 172 console.log(body); 173 } else { 174 console.log('error: '+ JSON.stringify(response)); 175 } 176 }); 177 }); 178}); 179 180//署名検証 181function validate_signature(signature, body) { 182 return signature === crypto.createHmac('sha256', process.env.LINE_CHANNEL_SECRET).update(new Buffer(JSON.stringify(body), 'utf8')).digest('base64'); 183} 184 185 186 187

Procfile

1// Procfile 2 3web: node index.js

Package.json

1// Package.json 2 3{ 4 "name": "ciecho", 5 "version": "1.0.0", 6 "description": "[![Deploy](https://www.herokucdn.com/deploy/button.svg)](https://heroku.com/deploy)", 7 "main": "index.js", 8 "dependencies": { 9 "@line/bot-sdk": "^5.2.0", 10 "async": "^2.6.0", 11 "babel-cli": "^6.26.0", 12 "body-parser": "^1.18.2", 13 "crypto": "^1.0.1", 14 "express": "^4.16.2", 15 "http": "0.0.0", 16 "mongodb": "^3.0.1", 17 "request": "^2.83.0" 18 }, 19 "devDependencies": {}, 20 "scripts": { 21 "start": "node ." 22 }, 23 "engines": { 24 "node": "8.9.3", 25 "npm": "5.5.1" 26 }, 27 "repository": { 28 "type": "git", 29 "url": "git+https://github.com/chikaichikai/ciecho.git" 30 }, 31 "author": "cici", 32 "license": "ISC", 33 "bugs": { 34 "url": "https://github.com/chikaichikai/ciecho/issues" 35 }, 36 "homepage": "https://github.com/chikaichikai/ciecho#readme", 37 "keywords": [ 38 "donut" 39 ] 40} 41

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

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

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

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

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

guest

回答1

0

ベストアンサー

回答者はぐるなびAPI, Node.jsについての知識はさほどありません.


推察するにNodeスクリプト側がパラメータを受け取れていません. エラーの原因はプロパティjson['result']の値がundefinedことによるもので, これはつまりリクエストの内容にフィールドresultが存在しないのと同義です.

問題解決のために当該Nodeスクリプトの呼び出し方について追記願います.
※もしくは, サンプルスクリプトの作成者当人に直接ご質問されたほうが良いでしょう.

参考:
node.js + expressでPOSTを受け取る & POSTパラメータをJSONで取得する
https://qiita.com/ktanaka117/items/596febd96a63ae1431f8

投稿2018/01/27 23:19

defghi1977

総合スコア4756

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

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

退会済みユーザー

退会済みユーザー

2018/01/28 03:24 編集

ありがとうございます。 このスクリプトは「Index.js」という名前のファイルです。 Node.js + herokuで動かす時に作成が求められるProcfileというものがあり、Procfileの中に記述されているものが最初に呼び出されます。 また、環境を記述するPackage.jsonファイルの中にも"main"として最初に呼ぶファイル(index.js)を書いています。 私の場合はindex.jsを最初に呼びたいのでindex.jsと書いています。 ※Procfile とPackage.json追記しました。 defghi1977様の以下のご依頼に応えられているでしょうか? >問題解決のために当該Nodeスクリプトの呼び出し方について追記願います. もし認識違いがあればお手数ですが教えていただけると大変助かります。 無学で申し訳ありません。 よろしくお願いいたします。
defghi1977

2018/01/28 03:26

これってHTTPリクエストをNode.js(index.js)でWEBサーバーとしてリッスンしている気がするんです. だから例えばWEBブラウザからNode.jsサーバーにアクセスした際に, 適切なデータをPOSTしないとうまく行かないと思うんです. なので, 「エラーを発生させたその手順」について詳しく記述して欲しいのです.
退会済みユーザー

退会済みユーザー

2018/01/28 03:41 編集

ありがとうございます。 LINEbotアカウントにテストでメッセージを投げても何も返ってこない状態なので、ターミナルで $ heroku logs するとタイトルのエラーが出た、という状況です。 LINEbotに投げた内容は、 東京都新宿区 // ここで改行 和食 のようなものです。 EclipseでRunしたりターミナルで $ node index.js によって実行した場合はエラーは出てこないのですが"Server is online"のログまでがコンソールに出てきて、("post() has been called")は出てこない、という時点で止まります。
defghi1977

2018/01/28 03:44

多分それだと駄目. 参考元を見ると, --- なにをやっているか /callbackにリクエスト(ユーザが送信するメッセージ)が来たら、 一行目:住所 例)岩手県盛岡市 二行目:検索キーワード 例)焼き肉、冷麺… を取り出して、ぐるなびのAPIに投げる。 --- とあるので, 少なくともリクエストとして”住所”と”検索キーワード”をサーバー側に渡さないと正しく動作しません. なので, この最初の「リクエストを渡す部分」をどうにかしないと. (逆に動作確認をするだけであれば, ぐるなび検索条件を直打ちするのもありかと思います)
退会済みユーザー

退会済みユーザー

2018/01/28 03:59 編集

「”住所”と”検索キーワード”をサーバー側に渡」す、というのは、herokuに渡すということでしょうか? LINEbotにテキスト: 岩手県盛岡市 焼肉 を投げても、サーバー側=herokuに届いていないということなのでしょうか? 今index.jsの中に直打ちしてテストしてみたところ、以下のようなログが出ました。 2018-01-28T03:52:08.356852+00:00 heroku[web.1]: Starting process with command `node index.js` 2018-01-28T03:52:10.041196+00:00 heroku[web.1]: State changed from starting to up 2018-01-28T03:52:09.937849+00:00 app[web.1]: app is running 2018-01-28T03:52:09.948782+00:00 app[web.1]: Server is online 2018-01-28T03:52:32.762224+00:00 app[web.1]: post() has been called 2018-01-28T03:52:33.465984+00:00 app[web.1]: http://fixie....<fixieのurl> 2018-01-28T03:52:33.740048+00:00 app[web.1]: error: undefined
defghi1977

2018/01/28 04:27

WEBの仕組み(サーバー・リクエスト・レスポンス)や, Node.jsの各種ライブラリの役割について調べていないとなると, 残念ながら基礎知識が不足していると言わざるを得ず, このままWEBサービスを利用するには余りに危険です.
退会済みユーザー

退会済みユーザー

2018/01/28 06:05

ご指摘ありがとうございます。 WEBの仕組みなど基礎的なところから勉強してまたトライすることにします。 お手数おかけしてすみませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問