Я работаю над услугой без сервера 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 выполнена успешно, но ни сообщение, ни ошибка не регистрируются.