Функция firestore / firebase onUpdate запускается дважды для каждого обновления - PullRequest
0 голосов
/ 06 августа 2020

У нас есть облачная функция, которая запускается каждый раз, когда документ беседы обновляется в firestore, чтобы отправить пользователю уведомление pu sh. Каждый раз, когда пользователь отправляет сообщение, мы обновляем диалог следующим образом, и журнал «Отправить сообщение» запускается только один раз, как ожидалось:

export const sendMessage = async (dispatch, conversationId, message) => {
  console.log('sending message', message);
  await firestore().collection('conversations').doc(conversationId).update({
    messages: firestore.FieldValue.arrayUnion(message),
    lastUpdated: moment().utc(true).toISOString()
  });

  const newConversationSnapshot = await firestore().collection('conversations').doc(conversationId).get();
  const conversationData = newConversationSnapshot.data();
  const lastMessage = last(conversationData.messages);

  console.log(lastMessage);
    };

При этом печатается следующий журнал с успешно обновленным диалогом:

[Thu Aug 06 2020 17:11:03.570]  LOG      sending message {"audio": false, "body": "Where are you going?", "createdAt": "2020-08-06T17:11:03.556Z", "receiver": "myi2A30VCYTrSm5CqyIKLVf52Xv1", "sender": "PlWABy0KitMo6ncnaBT8egoSlWF2"}
[Thu Aug 06 2020 17:11:03.818]  LOG      {"audio": false, "body": "Where are you going?", "createdAt": "2020-08-06T17:11:03.556Z", "receiver": "myi2A30VCYTrSm5CqyIKLVf52Xv1", "sender": "PlWABy0KitMo6ncnaBT8egoSlWF2"}

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

exports.onUpdateConversations = functions.firestore.document('conversations/{conversationsId}').onUpdate(async (event, context) => {
  try {
    console.log("onUpdateConversations");
    const beforeData = event.before.data();
    const afterData = event.after.data();
    await notificationService.handleNotificationObj(event.after.id, beforeData, afterData);
    return Promise.resolve();
  }
  catch (e) {
    return Promise.reject(e);
  }
})

В моей firebase GUI я вижу, что журнал onUpdateConversations печатается дважды при каждой отправке сообщения. Похоже, что при втором вызове поле lastUpdated имеет разницу в несколько секунд:

2020-08-07T11:15:37.257Z ? onUpdateConversations: on update conversations fired
2020-08-07T11:15:37.257Z ? onUpdateConversations: before data { createdAt: '2020-08-06T15:52:17.460Z',
2020-08-07T11:15:37.258Z ? onUpdateConversations:   lastUpdated: '2020-08-07T12:09:03.243Z',
2020-08-07T11:15:37.258Z ? onUpdateConversations:   firstUser: 'myi2A30VCYTrSm5CqyIKLVf52Xv1',
2020-08-07T11:15:37.258Z ? onUpdateConversations:   messages:
2020-08-07T11:15:37.258Z ? onUpdateConversations:    [ { audio: false,
2020-08-07T11:15:37.258Z ? onUpdateConversations:        body: 'Awesome',
2020-08-07T11:15:37.258Z ? onUpdateConversations:        createdAt: '2020-08-07T12:09:03.242Z',
2020-08-07T11:15:37.258Z ? onUpdateConversations:        receiver: 'PlWABy0KitMo6ncnaBT8egoSlWF2',
2020-08-07T11:15:37.258Z ? onUpdateConversations:        sender: 'myi2A30VCYTrSm5CqyIKLVf52Xv1' } ],
2020-08-07T11:15:37.258Z ? onUpdateConversations:   secondUser: 'PlWABy0KitMo6ncnaBT8egoSlWF2',
2020-08-07T11:15:37.258Z ? onUpdateConversations:   status: 'active',
2020-08-07T11:15:37.258Z ? onUpdateConversations:   uid: 'zqIbcU6kX7lePlJIOLZ5' } after data { createdAt: '2020-08-06T15:52:17.460Z',
2020-08-07T11:15:37.258Z ? onUpdateConversations:   firstUser: 'myi2A30VCYTrSm5CqyIKLVf52Xv1',
2020-08-07T11:15:37.258Z ? onUpdateConversations:   lastUpdated: '2020-08-07T12:09:03.243Z',
2020-08-07T11:15:37.258Z ? onUpdateConversations:   messages: [],
2020-08-07T11:15:37.258Z ? onUpdateConversations:   secondUser: 'PlWABy0KitMo6ncnaBT8egoSlWF2',
2020-08-07T11:15:37.258Z ? onUpdateConversations:   status: 'active',
2020-08-07T11:15:37.258Z ? onUpdateConversations:   uid: 'zqIbcU6kX7lePlJIOLZ5' }
2020-08-07T11:15:37.258981246Z D onUpdateConversations: Function execution took 13 ms, finished with status: 'ok'
2020-08-07T11:15:42.139913326Z D fetchSwipes: Function execution started
2020-08-07T11:15:42.680819Z D fetchSwipes: Function execution took 541 ms, finished with status code: 200
2020-08-07T11:15:52.419172721Z D onUpdateConversations: Function execution started
2020-08-07T11:15:52.433Z ? onUpdateConversations: on update conversations fired
2020-08-07T11:15:52.433Z ? onUpdateConversations: before data { createdAt: '2020-08-06T15:52:17.460Z',
2020-08-07T11:15:52.433Z ? onUpdateConversations:   firstUser: 'myi2A30VCYTrSm5CqyIKLVf52Xv1',
2020-08-07T11:15:52.433Z ? onUpdateConversations:   lastUpdated: '2020-08-07T12:09:03.243Z',
2020-08-07T11:15:52.433Z ? onUpdateConversations:   messages: [],
2020-08-07T11:15:52.433Z ? onUpdateConversations:   secondUser: 'PlWABy0KitMo6ncnaBT8egoSlWF2',
2020-08-07T11:15:52.433Z ? onUpdateConversations:   status: 'active',
2020-08-07T11:15:52.433Z ? onUpdateConversations:   uid: 'zqIbcU6kX7lePlJIOLZ5' } after data { createdAt: '2020-08-06T15:52:17.460Z',
2020-08-07T11:15:52.433Z ? onUpdateConversations:   firstUser: 'myi2A30VCYTrSm5CqyIKLVf52Xv1',
2020-08-07T11:15:52.433Z ? onUpdateConversations:   lastUpdated: '2020-08-07T12:15:52.247Z',
2020-08-07T11:15:52.433Z ? onUpdateConversations:   messages:
2020-08-07T11:15:52.433Z ? onUpdateConversations:    [ { audio: false,
2020-08-07T11:15:52.433Z ? onUpdateConversations:        body: 'Oh hello!',
2020-08-07T11:15:52.433Z ? onUpdateConversations:        createdAt: '2020-08-07T12:15:52.246Z',
2020-08-07T11:15:52.433Z ? onUpdateConversations:        receiver: 'PlWABy0KitMo6ncnaBT8egoSlWF2',
2020-08-07T11:15:52.433Z ? onUpdateConversations:        sender: 'myi2A30VCYTrSm5CqyIKLVf52Xv1' } ],
2020-08-07T11:15:52.434Z ? onUpdateConversations:   secondUser: 'PlWABy0KitMo6ncnaBT8egoSlWF2',
2020-08-07T11:15:52.434Z ? onUpdateConversations:   status: 'active',
2020-08-07T11:15:52.434Z ? onUpdateConversations:   uid: 'zqIbcU6kX7lePlJIOLZ5' }

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

Любая помощь приветствуется.

...