Программируемое SMS-сообщение Twilio не отправляется в развернутой лямбда-функции - PullRequest
0 голосов
/ 27 апреля 2020

Я работаю над услугой без сервера AWS, которая использует Программируемое SMS-сообщение Twilio для доставки текстовых сообщений.

Моя установка последовательно доставляет сообщения успешно, когда я запустить стек локально (например, sls offline start), но в развернутой среде мне кажется, что я даже не могу вызвать метод на клиенте Twilio .

Вот как устанавливается доставка сообщений up:

const twilio = require('twilio');

const twilioClient = twilio(
  process.env.TWILIO_SID,
  process.env.TWILIO_TOKEN,
  {
    lazyLoading: true,
  }
);

export function sendMessage(user, message) {
  twilioClient.messages.create({
    from: process.env.TWILIO_NUMBER,
    to: user.phone,
    body: message,
  }, function(err, message) {
    console.log('error', err);
    console.log('message', message);
  });
}

// And then usage in a Serverless Function Handler

function example(event, context, callback) {
  context.callbackWaitsForEmptyEventLoop = false;

  // user is also determined here
  sendMessage(user, 'This is a message');

  return {
    body: JSON.stringify({}),
    statusCode: 200
  };
}

Локально, при выполнении этого работает, и я могу видеть вывод журнала message, в журнале error ничего нет. Однако при развертывании запуск этого метода ничего не дает - кажется, что метод даже не вызывается (и я могу проверить в журналах Twilio, что не было сделано никакого вызова API), поэтому журналы error или message не создаются в обратный вызов.

При отладке я попробовал следующее:

  • Я зарегистрировал все переменные среды (Twilio SSID, токен авторизации, номер телефона), а также функцию аргументы, и все они, кажется, на месте. Я также проверил саму функцию Lambda, чтобы убедиться, что переменные среды существуют.
  • Я проверил мои журналы CloudWatch; ошибки и исключения не регистрируются. Кроме метода Twilio, который не вызывается, функция Lambda выполняется без проблем.
  • Я пробовал регистрировать такие вещи, как twilio и twilioClient.messages.create, чтобы убедиться, что определение клиента и функции не было уничтожено как-то.
  • Я подумал, может быть, это связано с context.callbackWaitsForEmptyEventLoop, поэтому я изменил его с false на true.

Я пуст, могу Не могу понять, почему это будет работать локально, но не при развертывании.


Редактировать: согласно примеру Twilio клиента , если вы опустите функцию обратного вызова, метод вернет Promise , Я пошел дальше и попытался дождаться ответа метода:

export function sendMessage(user, message) {
  return twilioClient.messages.create({
    from: process.env.TWILIO_NUMBER!,
    to: user.phone,
    body: message,
  });
}

// Usage...

async function example(event, context, callback) {
  context.callbackWaitsForEmptyEventLoop = false;

  try {
    const message = await sendMessage(user, 'This is a message');
    console.log('message', message)
  } catch (error) {
    console.log('error', error);
  }

  return {
    body: JSON.stringify({}),
    statusCode: 200
  };
}

В этом примере функция Lambda выполнена успешно, но ни сообщение, ни ошибка не регистрируются.

1 Ответ

1 голос
/ 27 апреля 2020

Я попробовал это, и это работает. Я попытался сделать мой код похожим на использование, с некоторыми изменениями.

const twilio = require('twilio');

const twilioClient = twilio(
  process.env.TWILIO_SID,
  process.env.TWILIO_TOKEN
);

let user = '+14075551212';

function sendMessage(user, message) {
  return twilioClient.messages.create({
    from: process.env.TWILIO_NUMBER,
    to: user,
    body: message,
  });
}

exports.handler = async function(event, context, callback) {
  try {
    const message = await sendMessage(user, 'This is a message');
    console.log('message', message);
    callback(null, {result: 'success'});
  } catch (error) {
    console.log('error', error);
    callback("error");
  }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...