Quantcast
Channel: Node.jsタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 9050

LINE BOTで天気を返すサンプルがngrokで動いてnowで動かない件

$
0
0

こちらのサンプルがngrokで動いて、Nowだとうまく動かない件の対応。

axiosを使って別のサーバーにリクエストを出してるので非同期処理のあたりが怪しいですね。

もとのコード

これだとngrokでうまく動くけど、now上でうまく動かないというレポート

server.js
省略functionhandleEvent(event){if(event.type!=='message'||event.message.type!=='text'){returnPromise.resolve(null);}letmes=''if(event.message.text==='天気教えて!'){mes='ちょっとまってね';//待ってねってメッセージだけ先に処理getNodeVer(event.source.userId);//スクレイピング処理が終わったらプッシュメッセージ}else{mes=event.message.text;}returnclient.replyMessage(event.replyToken,{type:'text',text:mes});}constgetNodeVer=async(userId)=>{constres=awaitaxios.get('http://weather.livedoor.com/forecast/webservice/json/v1?city=400040');constitem=res.data;awaitclient.pushMessage(userId,{type:'text',text:item.description.text,});}省略

書き換え

replyとpushのタイミングを変えてみる。

server.js
省略asyncfunctionhandleEvent(event){if(event.type!=='message'||event.message.type!=='text'){returnPromise.resolve(null);}//"天気教えて"以外の場合は反応しないif(event.message.text!=='天気教えて'){returnclient.replyMessage(event.replyToken,{type:'text',text:'"天気教えて"と言ってね'});}letmes='';mes='ちょっと待ってね';//"ちょっと待ってね"ってメッセージだけ先に処理awaitclient.replyMessage(event.replyToken,{type:'text',text:mes});//axiosを使って天気APIにアクセスconstCITY_ID=`400040`;//ライドアのAPIから取得したいシティのIDをconstURL=`http://weather.livedoor.com/forecast/webservice/json/v1?city=${CITY_ID}`;constres=awaitaxios.get(URL);constitem=res.data;returnclient.pushMessage(event.source.userId,{type:'text',text:item.description.text,});}省略

おまけ: 関数分けサンプル

関数に分けるとこんな感じ。

server.js
省略asyncfunctionhandleEvent(event){if(event.type!=='message'||event.message.type!=='text'){returnPromise.resolve(null);}//"天気教えて"以外の場合は反応しないif(event.message.text!=='天気教えて'){returnclient.replyMessage(event.replyToken,{type:'text',text:'"天気教えて"と言ってね'});}letmes='';mes='ちょっと待ってね';//"ちょっと待ってね"ってメッセージだけ先に処理awaitclient.replyMessage(event.replyToken,{type:'text',text:mes});constCITY_ID=`400040`;//ライドアのAPIから取得したいシティのIDをreturngetWeather(event.source.userId,CITY_ID);}constgetWeather=async(userId,CITY_ID)=>{//axiosを使って天気APIにアクセスconstURL=`http://weather.livedoor.com/forecast/webservice/json/v1?city=${CITY_ID}`;constres=awaitaxios.get(URL);constitem=res.data;returnclient.pushMessage(userId,{type:'text',text:item.description.text,});}省略

Viewing all articles
Browse latest Browse all 9050

Latest Images

Trending Articles