Облачная функция Firebase завершена со статусом «ошибка» - PullRequest
0 голосов
/ 02 июня 2018

Я пишу свою первую облачную функцию, чтобы отправлять push-уведомления, когда новый пользователь регистрируется в моем приложении для Android.Я сделал основы, такие как установка Node и firebase cli, и инициализировал мой проект.

Я написал эту тестовую функцию ниже, чтобы регистрировать идентификатор пользователя любого пользователя вместе с его токеном, который подписывается и развертывается в firebase.,

 exports.sendSignUpNotification =functions.database.ref('/users/{userId}').onWrite((change, context) => {
const user_id = context.params.userId;
//const notifID = context.params.notification_id;
console.log("User id at signup:\t", user_id);
//console.log("Notification id at signup:\t", notifID);

let token = admin.database().ref(`/users/{userId}/id_token`).once('value');
console.log("User id token:\t", token);

 return new Promise().then(data => {
    const payLoad = {
    notification: {
       title: "Thank You For Signing Up",
       body: "Enjoy the best features by becoming a premium user"
     }
   };
   return admin.messaging().sendToDevice(token, payLoad);
 }).catch(errs => {
  console.error("Error Sending Payload", errs);
});

});

Это отредактированный код для полной функции, но почему-то я знаю, что я делаю что-то не так при отправке полезной нагрузки.Это ошибка, которую я получаю ниже:

TypeError: Promise resolver undefined is not a function
at exports.sendSignUpNotification.functions.database.ref.onWrite (/user_code/index.js:15:10)
at Object.<anonymous> (/user_code/node_modules/firebase-functions/lib/cloud-functions.js:112:27)
at next (native)
at /user_code/node_modules/firebase-functions/lib/cloud-functions.js:28:71
at __awaiter (/user_code/node_modules/firebase-functions/lib/cloud-functions.js:24:12)
at cloudFunction (/user_code/node_modules/firebase-functions/lib/cloud-functions.js:82:36)
at /var/tmp/worker/worker.js:716:24
at process._tickDomainCallback (internal/process/next_tick.js:135:7)

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

mAuth.getCurrentUser().getIdToken(true).addOnCompleteListener(new OnCompleteListener<GetTokenResult>() {
                            @Override
                            public void onComplete(@NonNull Task<GetTokenResult> task) {
                                if (task.isSuccessful()) {
                                    String idToken = task.getResult().getToken();
                                    Log.d(TAG, "idToken:\t" + idToken);

                                    HashMap<String, String> usersMap = new HashMap<>();
                                    usersMap.put("name", name);
                                    usersMap.put("userId", userId);
                                    usersMap.put("email", email);
                                    usersMap.put("id_token", idToken);
          }

Я сохранил этот токен иссылался на это в моем скрипте для облачной функции.Это правильный токен или я должен использовать тот из FirebaseInstanceIdService, как показано ниже:

@Override
public void onTokenRefresh() {
    super.onTokenRefresh();

    String refreshedToken = FirebaseInstanceId.getInstance().getToken();
    Log.d(TAG, "Refreshed Token:\t" + refreshedToken);

}

Спасибо.

1 Ответ

0 голосов
/ 02 июня 2018

Вы используете старый бета-интерфейс API с новой версией 1.x SDK.Способ работы событий базы данных изменился.Изменения для всего SDK суммируются здесь .События onWrite теперь принимают два параметра: изменение и контекст.Изменение содержит моментальные снимки до и после, а контекст содержит подстановочные значения.

Чтобы получить подстановочный знак userId, вы бы сказали:

exports.sendSignUpNotification = functions.database.ref(`/users/{userId}`).onWrite((change, context) => {
    const userId = context.params.userId

См. Документацию . для более актуальных примеров.

Также в вашем коде в этой строке есть ошибка:

let token = admin.database().ref(`/users/{userId}/notificationTokens`).once('value');

Синтаксис JavaScript для интерполяции переменных в строке с разделителями обратным тэгом требует знака доллара:

`/users/${userId}/notificationTokens`

В этой строке есть еще одна ошибка.Вы не используете обещание, возвращаемое Once (), чтобы фактически получить значение в базе данных.token будет содержать это обещание, а не содержимое базы данных.

И вам также придется возвращать обещание, которое разрешается, когда вся асинхронная работа выполняется в функции, которую выв настоящее время не делает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...