こちらのサンプルがngrokで動いて、Nowだとうまく動かない件の対応。
axiosを使って別のサーバーにリクエストを出してるので非同期処理のあたりが怪しいですね。
もとのコード
これだとngrokでうまく動くけど、now上でうまく動かないというレポート
server.js
・
・
省略
・
・
function handleEvent(event) {
if (event.type !== 'message' || event.message.type !== 'text') {
return Promise.resolve(null);
}
let mes = ''
if(event.message.text === '天気教えて!'){
mes = 'ちょっとまってね'; //待ってねってメッセージだけ先に処理
getNodeVer(event.source.userId); //スクレイピング処理が終わったらプッシュメッセージ
}else{
mes = event.message.text;
}
return client.replyMessage(event.replyToken, {
type: 'text',
text: mes
});
}
const getNodeVer = async (userId) => {
const res = await axios.get('http://weather.livedoor.com/forecast/webservice/json/v1?city=400040');
const item = res.data;
await client.pushMessage(userId, {
type: 'text',
text: item.description.text,
});
}
・
・
省略
・
・
書き換え
replyとpushのタイミングを変えてみる。
server.js
・
・
省略
・
・
async function handleEvent(event) {
if (event.type !== 'message' || event.message.type !== 'text') {
return Promise.resolve(null);
}
//"天気教えて"以外の場合は反応しない
if(event.message.text !== '天気教えて') {
return client.replyMessage(event.replyToken, {
type: 'text',
text: '"天気教えて"と言ってね'
});
}
let mes = '';
mes = 'ちょっと待ってね'; //"ちょっと待ってね"ってメッセージだけ先に処理
await client.replyMessage(event.replyToken, {
type: 'text',
text: mes
});
//axiosを使って天気APIにアクセス
const CITY_ID = `400040`; //ライドアのAPIから取得したいシティのIDを
const URL = `http://weather.livedoor.com/forecast/webservice/json/v1?city=${CITY_ID}`;
const res = await axios.get(URL);
const item = res.data;
return client.pushMessage(event.source.userId, {
type: 'text',
text: item.description.text,
});
}
・
・
省略
・
・
おまけ: 関数分けサンプル
関数に分けるとこんな感じ。
server.js
・
・
省略
・
・
async function handleEvent(event) {
if (event.type !== 'message' || event.message.type !== 'text') {
return Promise.resolve(null);
}
//"天気教えて"以外の場合は反応しない
if(event.message.text !== '天気教えて') {
return client.replyMessage(event.replyToken, {
type: 'text',
text: '"天気教えて"と言ってね'
});
}
let mes = '';
mes = 'ちょっと待ってね'; //"ちょっと待ってね"ってメッセージだけ先に処理
await client.replyMessage(event.replyToken, {
type: 'text',
text: mes
});
const CITY_ID = `400040`; //ライドアのAPIから取得したいシティのIDを
return getWeather(event.source.userId, CITY_ID);
}
const getWeather = async (userId, CITY_ID) => {
//axiosを使って天気APIにアクセス
const URL = `http://weather.livedoor.com/forecast/webservice/json/v1?city=${CITY_ID}`;
const res = await axios.get(URL);
const item = res.data;
return client.pushMessage(userId, {
type: 'text',
text: item.description.text,
});
}
・
・
省略
・
・