javascript - TypeError:firestore.collection 不是函数(React / Redux / Firestore)
问题描述
问题很简单 - 当我尝试使用 Firestore / React / Redux 执行操作时,我收到此错误 -TypeError: firestore.collection is not a function
在以下代码行中 -
export const addObject = (object) => {
return (dispatch, getState, {getFirestore}) => {
const firestore = getFirestore();
const authorId = getState().firebase.auth.uid;
firestore.collection('objects').add({ <==== THIS LINE
...object
}).then(() => {
dispatch({ type: 'ADD_OBJECT_SUCCESS' });
}).catch(err => {
dispatch({ type: 'ADD_OBJECT_ERROR' }, err);
});
}
};
在检查了组件道具等之后,我发现firestore确实似乎没有一个名为collection的功能。这没有任何意义,因为我发现的每个资源都是这样做的,而且通常,Firestore确实将集合作为一个函数(我之前使用过它,但没有使用 redux)。这是我下面的一些代码-
objectReducer.js
const initState = {}
const projectReducer = (state = initState, action) => {
switch (action.type) {
case 'CREATE_OBJECT_SUCCESS':
console.log('create object success');
return state;
case 'CREATE_OBJECT_ERROR':
console.log('create object error');
return state;
default:
return state;
}
};
export default projectReducer;
应用程序.js
const fbConfig = {
// Configuration
}
const rrfConfig = {
userProfile: 'users',
useFirestoreForProfile: true,
attachAuthIsReady: true
}
firebase.initializeApp(fbConfig)
firebase.firestore()
const rootReducer = combineReducers({
auth: authReducer,
users: objectReducer,
firebase: firebaseReducer,
firestore: firestoreReducer
})
// Create store with reducers and initial state
const initialState = {}
const store = createStore(
rootReducer,
initialState,
compose (
applyMiddleware(thunk.withExtraArgument({getFirebase, getFirestore})),
reduxFirestore(fbConfig)
)
)
const rrfProps = {
firebase,
config: rrfConfig,
dispatch: store.dispatch,
createFirestoreInstance
}
function AuthIsLoaded({ children }) {
const auth = useSelector(state => state.firebase.auth)
if (!isLoaded(auth)) return <div>Loading, please wait...</div>;
return children
}
function App() {
return (
<Provider store={store}>
<ReactReduxFirebaseProvider {...rrfProps}>
...
</ReactReduxFirebaseProvider>
</Provider>
);
}
我省略了所有导入和其他不必要的文件/代码。但是,如果有人需要更多信息,我很乐意提供。先感谢您!
解决方案
index.js
import { createStore, applyMiddleware, compose } from 'redux';
import rootReducer from './store/reducers/rootReducer';
import { Provider } from 'react-redux';
import thunk from 'redux-thunk';
import fbConfig from './config/fbConfig';
import { ReactReduxFirebaseProvider, getFirebase } from 'react-redux-firebase';
import { reduxFirestore, getFirestore, createFirestoreInstance } from 'redux-firestore';
import firebase from 'firebase/app';
import { useSelector } from 'react-redux';
import { isLoaded } from 'react-redux-firebase';
const store = createStore(
rootReducer,
compose(
applyMiddleware(thunk.withExtraArgument({ getFirebase, getFirestore })),
reduxFirestore(fbConfig, /* ***!NOTE =>*** */ firebase)
)
);
const rrfConfig = {
userProfile: 'users',
useFirestoreForProfile: true,
};
const rrfProps = {
firebase,
config: rrfConfig,
dispatch: store.dispatch,
createFirestoreInstance,
};
firebaseConfig.js
import firebase from 'firebase/app';
import 'firebase/firestore';
import 'firebase/auth';
const firebaseConfig = {
apiKey: '*',
authDomain: '*',
databaseURL: '*',
projectId: '*',
storageBucket: '*',
messagingSenderId: '*',
appId: '*',
measurementId: '*'
};
firebase.initializeApp(firebaseConfig);
firebase.firestore()
export default firebase;
这段代码对我有用我认为你的问题是你没有将firebase本身传递给reduxFirestore
reduxFirestore(fbConfig, firebase)
试试这个应该可以的
推荐阅读
- c - Pthread:相对于线程数增加程序执行时间
- amazon-web-services - Windows 中的 aws-cli 命令从 s3 存储桶中获取最新对象
- javascript - 反应中的aggrid mouseup事件
- java - spring数据保存可迭代方法是否使用批处理操作并以相同的顺序返回结果?
- r - 如何撤消日志转换以删除负值
- azure - Redirecting user to app service instance according to location
- google-cloud-platform - 在从 python 创建 GCP 实例期间复制文件
- eclipse - 如何将非eclipse(Rational Application Development)struts应用程序导入eclipse
- stored-procedures - 在下面的 db2 存储过程中。我想从 db 设置 id fetch 的值并在第二个插入查询中使用
- jsf - 如何从服务器端的 p:editor 获取纯文本?