Twilio — push-уведомления не работают при бессерверном производственном развертывании

У меня есть программируемое приложение для обмена сообщениями Twilio, которое развернуто в бессерверной среде Twilio.

let response = new Twilio.Response();
exports.handler = async function(context, event, callback) {

    const accountSid = context.ACCOUNT_SID
    const authToken = context.AUTH_TOKEN

    const twilioClient = context.getTwilioClient();

    const toAddress = event.to;
    const fromAddress = event.from

    var text = "something something";
    
    await twilioClient.messages
    .create({ 
      body: text, 
      to: toAddress, 
      from: fromAddress
    })
    .then(...)
    .catch(...)

    response.setStatusCode(200);

    callback(null, response);
}

Производство и разработка имеют отдельные наборы переменных среды, которые указывают на их собственные сертификаты песочницы/производства.

ACCOUNT_SID=ACxxx
AUTH_TOKEN=xxx
API_KEY_SID=SKxxx
API_SECRET=xxx
APP_SID=APxxx
PUSH_CREDENTIAL_SID=CRxxx
CONVERSATIONS_SID=ISxxx
APN_PUSH_CREDENTIAL_SID=CRxxx

Это отлично работает при разработке, и push-уведомления запускаются и отправляются на соответствующее устройство iOS.

После развертывания в рабочей среде и использования со сборкой TestFlight кажется, что контекст сервера не использует правильные учетные данные сертификата. Я получаю ошибки

  • 52004 — Не указан SID учетных данных.
  • 52134 — Неверный токен устройства APN.

Я знаю, что push-сертификаты верны, поскольку межклиентские чаты iOS работают как в dev, так и в prod, а push-уведомления отправляются и приходят, как и ожидалось.

Мой вопрос в том, какой секретный соус мне нужен для привязки/присоединения производственных учетных данных push к клиенту Twilio при использовании из бессерверного контекста.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
70
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ошибка возникла из-за проблемы с конфигурацией в Twilio.

  1. Учетная запись имеет один глобальный модуль «Беседы». Этот модуль имеет настройки по умолчанию для службы разговоров и службы обмена сообщениями.
  2. Служба сообщений, настроенная для автоматического создания бесед, всегда будет использовать службу бесед по умолчанию. Невозможно назначить конкретную службу разговоров службе обмена сообщениями.

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

Эту проблему можно обойти, переключаясь между экземплярами службы разговоров, например:

const twilioClient = context.getTwilioClient();

const configuration_post = await twilioClient.conversations.v1
    .configuration()
    .update({ defaultChatServiceSid: myConversationServiceSid });


await twilioClient.messages
    .create({ 
      body: text, 
      to: toAddress, 
      from: fromAddress
    })

Это означает, что вам нужно не забыть переключить его обратно на желаемый сервис после завершения разработки.

Однако если вы используете веб-перехватчики Post Event, такие как onConversationAdded, они запускаются асинхронно, и служба диалога, установленная в конце потока отправки сообщений, может быть не той, которая вам нужна.

Другие вопросы по теме

Проблема при запросе пакетов в комплекте с веб-пакетом
Не удалось создать пользовательский тип ответа в Express.js с помощью TypeScript
Загрузите видео на S3 с Android с помощью Nextjs Backend
Ошибка для angular 7.2. Путь к данным «.builders['application']» должен быть объектом
Используйте сертификат PFX для получения токена Microsoft Entra. Ошибка: secretOrPrivateKey должен быть асимметричным ключом при использовании RS256
Мой файл докеров для развертывания моего углового приложения не запускает приложение с помощью веб-сервера ни nodeJs, ни nginx
Сокет Node.Js зависает в пуле соединений ClickhouseDb
Невозможно получить содержимое стенограммы через Graph API
Как создать диаграммы на моем веб-сайте JavaScript, используя данные из базы данных MySQL. Использование внешнего интерфейса EJS
Ошибка: оценка не удалась: TypeError: невозможно прочитать свойства неопределенного значения (чтение «по умолчанию»)