【发布时间】:2020-06-30 04:22:18
【问题描述】:
在一个 react-native 应用程序中,我调用一个动作将数据发送到 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 中执行),它使用来自 firestore 中的集合的消息填充 redux 存储。快照监听器看起来像:
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 的相应 reducer,如下所示:
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调用的承诺性质的延迟正在发生一些事情,并且延迟导致时间值的空初始化,但它的时间足以使应用程序崩溃。
问题:这里的幕后实际发生了什么,我该如何防止这个错误?
【问题讨论】:
-
doc.get('time') 是否为空?
-
@LajosArpad 当我在屏幕组件中访问它时,它会显示时间
-
如果我是你,我会在
msg.time = doc.get('time').toMillis();行之前以console.log(doc.get('time').toMillis())的形式做一个实验。你会看到那是否是空的东西。这是您解决问题所需的关键信息。 -
@LajosArpad 已经有了。所有时间都被记录
-
您能否逐字引用您收到的问题的确切错误消息?
标签: javascript firebase react-native redux react-redux