Приложение TwiML и Firebase отклоняют необработанные обещания: Ошибка: не удалось загрузить учетные данные по умолчанию

# #javascript #node.js #firebase #twilio #twilio-twiml

Вопрос:

Контекст:

Мое приложение использует VoIP с использованием TwiML, я храню записи вызовов и дополнительные данные в Firebase. Когда создается вызов, Twilio является центральной точкой, где создается / отменяется вызов. По этой причине при выполнении вызова я использую Firebase для создания записи вызова в Firebase.


Искал некоторую документацию в Интернете по этой проблеме, поддержке или подобным проблемам, но ничего не нашел. Проблема довольно проста:

Вывод журнала:

Я вижу вывод журнала до этого сообщения:

получение профиля из

затем получите эту ошибку:

Предупреждение о необработанном отказе от обещания: Ошибка: не удалось загрузить учетные данные по умолчанию. Перейдите к https://cloud.google.com/docs/authentication/getting-started для получения дополнительной информации. в GoogleAuth.getApplicationDefaultAsync (/var/task/node_modules/google-auth-library/build/src/auth/googleauth.js:180:19) в processTicksAndRejections (internal/process/task_queues.js:97:5) в async GoogleAuth.getClient (/ var/задача/node_modules/google-auth-library /build /src /auth / goo…


аналогично функциям Firebase Код приложения TwiML:

 const AccessToken = require('twilio').jwt.AccessToken;
const VoiceGrant = AccessToken.VoiceGrant;
const VoiceResponse = require('twilio').twiml.VoiceResponse;

// Import the functions you need from the SDKs you need
const firebase = require("firebase-admin")

const firebaseConfig = {
    apiKey: "",
    authDomain: "",
    databaseURL: "",
    projectId: "",
    storageBucket: "",
    messagingSenderId: "",
    appId: "",
    measurementId: ""
};

// Initialize Firebase
console.log("initializing firebase")
const app = firebase.initializeApp(firebaseConfig);

exports.handler = async function(context, event, callback) {
    console.log("Running make-call")
    const from = event.From;
    let to = event.to;
    //...

    console.log("getting profile from")
    // exception is thrown at this line below
    var callerProfileSnap = await firebase.firestore(app).collection("profiles").doc(from).get();

    // originally had this, but attempted loading the app manually as "credentials" couldn't be loaded made me think this might be an issue
    // var callerProfileSnap = await firebase.firestore().collection("profiles").doc(from).get();

    // ... continuation of code

    var voiceResponse;
    callback(null, voiceResponse);
}
 

Есть идеи, что может вызвать это / почему это происходит? Не удалось найти много решений в Интернете

Ответ №1:

Решение было простым, вызванным недосмотром.

Twilio автоматически добавляет «client:» к event.From полю. Это была попытка найти документ client:abcd1234... в firestore, который не существует.

Однако ошибка вводила в заблуждение, не имея ничего общего с неверными учетными данными, но фактически содержала отсутствующий документ firestore.


Возможные решения:

  1. Очистить ввод:

Проверьте, event.From содержит ли «client:», если это так, позвоните .split(":")[1] , чтобы получить идентификатор или последнюю часть From параметра.

  1. Используйте пользовательские параметры Twilio, отправленные с клиента, которые будут включены в payload объект.

например, добавление пользовательских параметров, таких как:

 customParams: {
    "hello": "world",
    "another": "entry"
}
 

затем они будут доступны в полезной нагрузке следующим образом:

  • payload.hello
  • payload.another