前提・実現したいこと
LINEで地名を送信したら、その地名の天気を返してくれるbotを作っています。
天気情報はlivedoor天気のWeather Hacksから持ってきます。
実行環境はnode.jsです。
発生している問題・エラーメッセージ
undefined:1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> ^ SyntaxError: Unexpected token < in JSON at position 0 at JSON.parse (<anonymous>) at Request._callback (C:\Users\user_name\Desktop\GoogleGit\wetherbot\LINE_Weather.js:197:15) at Request.self.callback (C:\Users\user_name\Desktop\GoogleGit\wetherbot\node_modules\request\request.js:185:22) at emitTwo (events.js:126:13) at Request.emit (events.js:214:7) at Request.<anonymous> (C:\Users\user_name\Desktop\GoogleGit\wetherbot\node_modules\request\request.js:1157:10) at emitOne (events.js:116:13) at Request.emit (events.js:211:7) at IncomingMessage.<anonymous> (C:\Users\user_name\Desktop\GoogleGit\wetherbot\node_modules\request\request.js:1079:12) at Object.onceWrapper (events.js:313:30)
該当のソースコード
JavaScript
1const express = require('express'); 2const line = require('@line/bot-sdk'); 3const PORT = process.env.PORT || 3000; 4var json = null; /** jsonを入れる変数 */ 5 6/* LINEBotを使うためのAPI設定 */ 7'use strict'; 8const config = { // アクセストークンとシークレットをconfigに格納 9 channelAccessToken: '', 10 channelSecret:'' 11}; 12 13const app = express(); 14 15app.post('/webhook', line.middleware(config), (req, res) => { 16 console.log(req.body.events); 17 Promise 18 .all(req.body.events.map(handleEvent)) 19 .then((result) => res.json(result)); 20}); 21 22const client = new line.Client(config); 23var cityCode; 24 25/* LINEからPOSTをキャッチして処理するAPI */ 26function handleEvent(event) { 27 if (event.type !== 'message' || event.message.type !== 'text') { 28 return Promise.resolve(null); 29 } 30 /**受け取ったメッセージが連想配列にあるかを判定 */ 31 if (typeof city.prop !== event.message.text) { 32 cityCode = city[event.message.text]; // あった場合はcityCodeに都市ID(東京なら130010)を入れる 33 } 34 return client.replyMessage(event.replyToken, { 35 type: 'text', 36 text: strBody //実際に返信の言葉を入れる箇所 37 }); 38} 39 40app.listen(PORT); 41console.log(`Server running at ${PORT}`); 42 43/**連想配列で都市コードを定義 */ 44var city = { 45 '稚内': '011000', 46 '旭川': '012010', 47 '留萌': '012020', 48 '網走': '013010', 49 '北見': '013020', 50 '紋別': '013030', 51 '根室': '014010', 52 ~~~~~~~~~~~~~~~ 53 ~~~~~~~~~~~~~~~ 54}; 55/* livedoor天気から天気情報を取得するAPI */ 56var URL = 'http://weather.livedoor.com/forecast/webservice/json/v1?city=' + cityCode; // 都市コードを足して取得する地域のURLを決める 57 58/** livedoor天気から天気情報を取得 */ 59let request = require('request'); 60request.get(URL, function (err, res, body) { 61 if (err) { 62 console.log('Error: ' + err.message); 63 return; 64 } 65 json = JSON.parse(body); 66
試したこと
handleEvent()関数内ではcityCodeに値が入っているのは確認済みです。
この関数外でcityCodeを使えれば上手くいきそうと睨んでいます。
handleEvent内に既にreturn文があるためreturnで変数を返すという方法もできませんでした。
補足情報(FW/ツールのバージョンなど)
プログラミングを初めて3カ月ほどですので、わかりにくいところや、ほかに必要な情報などあれば仰ってください
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/07/05 13:35
2018/07/05 16:02