【发布时间】:2022-01-09 17:50:21
【问题描述】:
我正在NextJS 中构建一个使用 Firebase 身份验证的应用程序。成功验证后,我希望获取有关存储在MongoDB 实例中的客户的其他详细信息(或在首次登录时为客户创建一个新文档)。因为我无法访问 getServerSideProps 中的 firebase auth 对象,所以我在 firebase.auth() 之后重定向到 /dashboard/${user.uid},然后 getsServerSideProps 使用传递的 uid 来获取自定义/动态内容。
dashboard.js
export default function DashboardAuth(props) {
const [user, loading, error] = useAuthState(firebase.auth())
if (user){
return window.location.href = `/dashboard/${user.uid}`
} else {
return <SignIn/>
}
}
/dashboard/[id].js
export async function getServerSideProps({ params }) {
let userData
console.log("Logging in ")
const { db } = await connectToDatabase();
console.log("connected to database, awaiting query response with uid")
const findUserResp = await db
.collection("users")
.findOne({'uid': params.id})
if(findUserResp ){
console.log("user data exists")
userData = {
uid: findUserResp.uid,
email: findUserResp.email,
displayName: findUserResp.displayName,
photoURL: findUserResp.photoURL,
storageQuoteRemaining: findUserResp.storageQuoteRemaining,
emailVerified: findUserResp.emailVerified,
currentPage: '/dashboard'
}
}else{
console.log("user data does not exist")
userData = {
uid:params.id,
email: '',
displayName: '',
photoURL: '',
storageQuoteRemaining: 0,
emailVerified: false,
currentPage: '/dashboard'
}
const addUserResp = await db
.collection("users")
.insertOne(userData)
}
console.log("returning userdata below")
console.log(userData)
return {
props: {
userData
}
}
}
export default function Dashboard(props) {
const [user, loading, error] = useAuthState(firebase.auth())
const userContext = getUserContext()
useEffect(() => {
userContext.handleCurrentUser(props.userData)
}, []);
if (user && props.userData.uid === user.uid){
return <Layout children={<CreateItem/>}/>
}else{
return <SignIn/>
}
}
我的主要问题是,在用户首次登录时最初添加到 mongodb 后,在重定向到 [id].js 后立即出现错误
Error: Error serializing `.userData._id` returned from `getServerSideProps` in "/dashboard/[id]".
Reason: `object` ("[object Object]") cannot be serialized as JSON. Please only return JSON serializable data types.
但在刷新时它会消失。
另外,我不喜欢我编写重定向的方式,但 useRouter 不起作用。任何有关如何更好地做到这一点的建议将不胜感激。
【问题讨论】:
-
userData._id来自哪里?从/dashboard/[id].js的getServerSideProps返回的userData对象中似乎没有_id属性。 -
另外:"useRouter doesn't work" -
router.push(`/dashboard/${user.uid}`)调用需要在useEffect中运行,user在其依赖项数组中。
标签: javascript reactjs next.js