Значение функции firebase onwrite иногда равно нулю - PullRequest
0 голосов
/ 20 марта 2019

Я пытаюсь внедрить систему заказов Android и использую базу данных реального времени. Для отправки уведомлений я использую функции Firebase в JavaScript.

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

Проблема появляется здесь. В некоторых случаях уведомление отправляется, а в других оно не . Просматривая логи моей функции sendNotif, я вижу, что ошибка такая:

TypeError: Cannot read property 'idcomprador' of null
    at exports.sendNotif.functions.database.ref.onWrite (/user_code/index.js:133:32)
    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:827:24
    at process._tickDomainCallback (internal/process/next_tick.js:135:7)

Мой код:

exports.sendNotif = functions.database.ref('/Usuarios/{vendedorId}/Solicitudes/Venta/{pushId}').onWrite((change, context) => {

  // Grab the current value of what was written to the Realtime Database.
  const solicitud = change.after.val();
  const compradorId = solicitud.idcomprador
  const pedidoId = solicitud.idpedido
  const vendedorId = solicitud.idvendedor
  var solicitudTokens = [vendedorId];

  // Notification details.
  const payload = {
    notification: {
      title: `Order`,
      body: `order`,
      icon: 'photoURL',
      tag: 'solicitudventa',
      sound: 'default',
      clickAction: 'ACTIVITY_ORDER',
      badge: '2'
    },
    data: {
      extra: 'extra_data',
    },
  };

  const options = {
    collapseKey: 'demo',
    contentAvailable: true,
    priority: 'high',
    timeToLive: 60 * 60 * 24,
  };


var ref = admin.database().ref(`Usuarios/${vendedorId}/token/result/token`);
return ref.once("value", function(snapshot){


        admin.messaging().sendToDevice(snapshot.val(), payload)

        },
    function (errorObject) {
        console.log("The read failed: " + errorObject.code);
    });
    });

Строка 133 выглядит следующим образом: const compradorId = solicitud.idcomprador . Я не могу понять, почему это иногда работает, а иногда нет.

1 Ответ

2 голосов
/ 20 марта 2019

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

Если инициирующее событие было созданием новых данных, change.before будет неопределенным (ранее данных не было), а change.after будетсодержат снимок.

Если инициирующее событие представляет собой удаление данных, change.before будет содержать снимок, а change.after будет неопределенным.

Ваш код слепо предполагает, что change.after содержит снимок.Вполне возможно, что удаление данных вызывает вашу функцию, и это не работает, потому что это не то, для чего она была разработана.

При использовании onWrite вы обязаны проверить этот случай и обработать его соответствующим образом.Если вам не нужны события удаления, попробуйте вместо этого использовать onCreate, чтобы просто захватывать новые данные.

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