Как мне объявить пользовательскую функцию в среде выполнения функции Twilio? - PullRequest
1 голос
/ 17 мая 2019

У меня есть функция и несколько вспомогательных функций, которые должны получить доступ к истории сообщений Slack и вернуть первое сообщение, которое соответствует определенной числовой строке.

Я тщательно протестировал код в среде Node.js моего компьютера, чтобы убедиться, что он работает и работает правильно.Тем не менее, я не могу заставить его работать в среде выполнения Twilio Function;Я получаю сообщение об ошибке «Отсутствует имя в объявлении функции», и функция просто не будет работать правильно или вообще не будет работать как функция.

Что я делаю неправильно?

exports.handler = function(context, event, callback) {

    if(event.event){
         if(event.event.channel == context.CHANNEL_ID){
            if(event.event.subtype){
                console.log("bot posting");
                if(event.event.thread_ts){
                    console.log("bot posting in thread");
                    console.log(event);
                }
                else{
                    console.log("bot posting in channel");
                    console.log(event);
                }
            }
            else{
                console.log("staff posting");
                if(event.event.thread_ts){
                    console.log("staff posting in thread");
                    console.log(event);
                }
                else{
                    console.log("staff posting in channel");
                    console.log(event);
                }
            }
         }
    }
    else{
        console.log("incoming sms message");
        console.log(typeof event.From);
    }


    returnTS("6049248010").then(function (ts) {
        console.log(ts);
    });

    callback(null);
};


var getSlackHistory = async function (ts) {

    try {
        var response;

        if (typeof ts === 'undefined') {
            response = await got('https://slack.com/api/channels.history?'
                + 'token=' + context.TWILIO_TOKEN
                + '&channel=' + context.TWILIO_CHANNEL_ID);
        }
        else {
            response = await got('https://slack.com/api/channels.history?'
                + 'token=' + context.TWILIO_TOKEN
                + '&channel=' + context.TWILIO_CHANNEL_ID
                + '&latest=' + ts);
        }

        return await JSON.parse(response.body);
    }
    catch (error) { console.log("failure"); }

}

var getAllSlackHistory = async function () {
    var message_history = [];
    try {
        var response = await getSlackHistory();
        //  console.log(response.messages[response.messages.length - 1].ts);
        for (var i = 0; i < response.messages.length; i++) {
            message_history.push(response.messages[i]);
        }
        while (response.has_more) {
            response = await getSlackHistory(response.messages[response.messages.length - 1].ts);
            for (var i = 0; i < response.messages.length; i++) {
                message_history.push(response.messages[i]);
            }
        }
        return await message_history;
    }
    catch (error) {
        console.log(error);
    }

}

var returnTS = async function (numberString) {
    try {
        var message_history = await getAllSlackHistory();
        //console.log(message_history.length);
        // console.log(numberString);
        for (var i = 0; i < message_history.length; i++) {
            //  console.log(message_history[i].text);
            // console.log(message_history[i].text.includes(numberString));
            if (message_history[i].text.includes(numberString))
                //  console.log(message_history[i].ts);
                return message_history[i].ts;
        }
    }
    catch (error) {
        console.log(error);
    }
}

1 Ответ

1 голос
/ 23 мая 2019

Разработчик Twilio здесь.

Как вы сказали в комментариях, это связано с асинхронными операциями и обратным вызовом функций Twilio.

В настоящее время последние несколько строк вашей функции:

  returnTS("6049248010").then(function (ts) {
      console.log(ts);
  });

  callback(null);
};

returnTS - это асинхронная функция, в этом случае возвращающая обещание. Функции Twilio прекратят все операции после вызова функции callback (или через 5 секунд), поэтому в этом случае вы должны вызывать callback только после завершения асинхронных функций. Если вы переместите вызов на callback в обратном вызове обещания, тогда все должно работать так, как вы ожидаете. Вместо этого попробуйте следующее:

  returnTS("6049248010").then(function (ts) {
      console.log(ts);
      callback(null);
  });
};
...