前提・実現したいこと
LINE BOTのMessaging API(Node.js)を使用して、レシピ検索のようなボットを開発しています。
楽天レシピAPI
を実行して、取得した値をメッセージとして送信する処理で躓いています。
https://webservice.rakuten.co.jp/api/recipecategoryranking/
発生している問題・エラーメッセージ
handleEvent()
の中で楽天レシピAPIを実行しています。
最終的にhandleEvent()
にreturn client.replyMessage(event.replyToken, echo);
を返せばメッセージが送信されるのですが、
今の書き方だと.then(data => {・・・})
の中でreturn
しているせいなのか、return client.replyMessage(event.replyToken, echo);
を記述してもメッセージが送信されません。
今回のような非同期やhttpリクエストの知見が乏しくて完全に手が止まりました。
どのような書き方をすればいいでしょうか?
該当のソースコード
'use strict'; const line = require('@line/bot-sdk'); const express = require('express'); const axios = require('axios'); // create LINE SDK config from env variables const config = { channelAccessToken: process.env.CHANNEL_ACCESS_TOKEN, channelSecret: process.env.CHANNEL_SECRET, }; // create LINE SDK client const client = new line.Client(config); // create Express app // about Express itself: https://expressjs.com/ const app = express(); // register a webhook handler with middleware // about the middleware, please refer to doc app.post('/callback', line.middleware(config), (req, res) => { Promise .all(req.body.events.map(handleEvent)) .then((result) => res.json(result)) .catch((err) => { console.error(err); res.status(500).end(); }); }); // event handler function handleEvent(event) { if (event.replyToken === '00000000000000000000000000000000') { return {} } if (event.type !== 'message' || event.message.type !== 'text') { // ignore non-text-message event return Promise.resolve(null); } // RAKUTEN Recipe API const appId = process.env.RAKUTEN_RECIPE_API_APP_ID const catId = event.message.text const request = `https://app.rakuten.co.jp/services/api/Recipe/CategoryRanking/20170426?applicationId=${appId}&formatVersion=2&categoryId=${catId}` fetch(request, { method: "GET", }) .then(response => response.text()) .then(data => { console.log(data); // create a echoing text message const echo = [{ type: 'text', text: event.message.text }, { type: 'text', text: data } ] // ここでreturnしてもhandleEvent()に返らない?からメッセージが送信できない return client.replyMessage(event.replyToken, echo); }); // use reply API // ここでreturnすればhandleEvent()に返ってメッセージが送信される // return client.replyMessage(event.replyToken, echo); } // listen on port const port = process.env.PORT || 3000; app.listen(port, () => { console.log(`listening on ${port}`); });
↓ 追記:20200821 13:48
NovisHub様からご回答を頂き、試してみたコードです。
こちらのコードでもメッセージが送信されませんでした。
また、現在herokuで動かしており、
コードを修正 → デプロイ → LINEでメッセージを送って動作確認
のような感じで作業しているのですが、エラーメッセージを見るなど良いデバッグ方法はありませんでしょうか?
こちらがサイト側のURLです。
https://line-recipe.herokuapp.com/
ご回答を頂いて試してみたコード
'use strict'; const line = require('@line/bot-sdk'); const express = require('express'); const axios = require('axios'); // create LINE SDK config from env variables const config = { channelAccessToken: process.env.CHANNEL_ACCESS_TOKEN, channelSecret: process.env.CHANNEL_SECRET, }; // create LINE SDK client const client = new line.Client(config); // create Express app // about Express itself: https://expressjs.com/ const app = express(); // register a webhook handler with middleware // about the middleware, please refer to doc app.post('/callback', line.middleware(config), (req, res) => { Promise .all(req.body.events.map(handleEvent)) .then((result) => res.json(result)) .catch((err) => { console.error(err); res.status(500).end(); }); }); // event handler function handleEvent(event) { if (event.replyToken === '00000000000000000000000000000000') { return {} } if (event.type !== 'message' || event.message.type !== 'text') { // ignore non-text-message event return Promise.resolve(null); } // RAKUTEN Recipe API const appId = process.env.RAKUTEN_RECIPE_API_APP_ID const catId = event.message.text const request = `https://app.rakuten.co.jp/services/api/Recipe/CategoryRanking/20170426?applicationId=${appId}&formatVersion=2&categoryId=${catId}` return new Promise(function (resolve, reject) { fetch(request, { method: "GET", }) .then(response => response.text()) .then(data => { console.log(data); const echo = [{ type: 'text', text: event.message.text }, { type: 'text', text: data } ] client.replyMessage(event.replyToken, echo).then(function (messageAPIResponseBase) { resolve(); }).catch(function (error) { reject(error); }); }); }); // use reply API // return client.replyMessage(event.replyToken, echo); } // listen on port const port = process.env.PORT || 3000; app.listen(port, () => { console.log(`listening on ${port}`); });
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/08/21 04:55
退会済みユーザー
2020/08/21 06:06
2020/08/21 06:55 編集
退会済みユーザー
2020/08/21 09:07
2020/08/24 05:29