В приложении с естественным взаимодействием я вызываю действие, отправляющее данные в firebase. но после вызова я получаю сообщение об ошибке, источник которого, похоже, связан с тем, как работает прослушиватель снимков. действие add-msg более или менее выглядит следующим образом:
создание данных:
const addMsg = (msg, convoIds) => {
console.log('Firestore Write: (actions/conversation) => addMsg()');
return firebase.firestore().collection('messages').add({
time: firebase.firestore.FieldValue.serverTimestamp(),
sender: msg.sender,
receiverToken: msg.receiverToken,
sessionId: msg.sessionId,
read: false,
charged: false,
userConvos: [ convoIds.sender, convoIds.receiver ],
content: {
type: 'msg',
data: msg.text
}
});
};
У меня также есть прослушиватель моментальных снимков (который выполняется в componentDidMount), который заполняет хранилище избыточности сообщениями от Коллекция в пожарном магазине. слушатель снимка выглядит следующим образом:
export const getMessages = (convoId) => {
const tmp = convoId == null ? '' : convoId;
return (dispatch) => {
console.log('Firestore Read (Listener): (actions/conversation) => getMessages()');
return new Promise((resolve, reject) => {
firebase
.firestore()
.collection('messages')
.where('userConvos', 'array-contains', tmp)
.orderBy('time')
.onSnapshot((querySnapshot) => {
const messages = [];
querySnapshot.forEach((doc) => {
const msg = doc.data();
msg.docId = doc.id;
msg.time = doc.get('time').toMillis();
messages.push(msg);
});
dispatch({ type: types.LOAD_MSGS, payload: messages });
resolve();
});
});
};
};
соответствующий редуктор, который заполняет flatList в том же компоненте экрана, который выглядит следующим образом:
const INITIAL_STATE = {
messages: []
};
export default (state = INITIAL_STATE, action) => {
switch (action.type) {
case types.LOAD_MSGS:
return {
messages: action.payload
};
default:
return { ...state };
}
};
Проблема: один раз данные отправляет, я сразу получаю ошибку TypeError: null is not an object (evaluating 'doc.get('time').toMillis'
. если я перезагружаю приложение, возвращаюсь к рассматриваемому экрану, появляется сообщение, а также данные о времени. Таким образом, я предполагаю, что что-то происходит с задержкой в простом характере вызовов Firebase, и эта задержка вызывает нулевую инициализацию значения времени, но его достаточно долго, чтобы обработать sh приложение.
Вопрос: что здесь на самом деле происходит за кулисами и как я могу предотвратить эту ошибку?