こちらのサンプルが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,});}・・省略・・