我正在尝试在 Nuxt 应用(静态)中实现 Firebase。我安装了@nuxtjs/firebase,配置了它,并使它与 auth 一起工作(登录和注销都有效)。我想在登录后锁定整个应用程序。
但是当我启用中间件时,应用程序崩溃了。 这是因为,我认为,为了使模块在 SSR 中工作,还有一些额外的步骤要做。我认为在服务器中,由于未设置用户,中间件会触发重定向,对吗? 我怎样才能实现一个有效的中间件?
中间件代码 auth.js
:
export default function ({ store, redirect }) {
if (!store.state.user) {
return redirect('/login')
}
}
商店代码 index.js
export const state = () => ({
user: null,
userData: {}
})
export const getters = {
}
export const mutations = {
onAuthStateChangedMutation(state, {authUser}){
if (!authUser) {
state.user = null
} else {
const { uid, email } = authUser
state.user = { uid, email }
}
},
setUserData(state, payload){
state.userData = payload
}
}
export const actions = {
async onAuthStateChangedAction({commit}, {authUser}){
if (!authUser) {
state.userData = {}
} else {
try{
const userRef = await this.$fire.firestore.collection('users').doc(authUser.uid).get()
const userData = await userRef.data()
commit('setUserData', userData)
}
catch(e){
console.log(e)
}
}
}
}
在nuxt.config
firebase: {
services:{
auth:{
ssr: true,
initialize:{
onAuthStateChangedMutation: 'onAuthStateChangedMutation',
onAuthStateChangedAction: 'onAuthStateChangedAction',
}
},
firestore: true,
analytics: true
}
},
router:{
middleware: 'auth'
}
答案 0 :(得分:0)
我设法使它工作,合并了关于 nuxtjs firebase 文档和我的用例的信息。如果有人有更好的想法或发现我的解决方案中的漏洞,请随时贡献:
商店代码 index.js
export const state = () => ({
user: null,
userData: null,
isUserReady: false
})
export const getters = {
}
export const mutations = {
onAuthStateChangedMutation(state, {authUser}){
if (!authUser) {
state.user = null
} else {
const { uid, email } = authUser
state.user = { uid, email }
}
},
clearUserData(state){
state.isUserReady = false
state.userData = null
},
setUserData(state, payload){
state.userData = payload
state.isUserReady = true
}
}
export const actions = {
async nuxtServerInit({ commit }, { res }) {
if (res && res.locals && res.locals.user) {
const { ...authUser } = res.locals.user
commit('onAuthStateChangedMutation', { authUser })
}
},
async onAuthStateChangedAction({commit}, {authUser}){
if (!authUser) {
commit('clearUserData')
} else {
try{
const userRef = await this.$fire.firestore.collection('users').doc(authUser.uid).get()
const userData = await userRef.data()
commit('setUserData', userData)
}
catch(e){
console.log(e)
}
}
}
}
在nuxt.config.js
firebase: {
config:{
...
},
services:{
auth:{
initialize:{
onAuthStateChangedMutation: 'onAuthStateChangedMutation',
onAuthStateChangedAction: 'onAuthStateChangedAction',
}
},
firestore: true,
}
},
pwa: {
manifest: {
lang: 'en'
},
workbox: {
importScripts: [
'/firebase-auth-sw.js'
],
dev: true
}
}
通过这些设置,我能够在 Netlify 上部署应用程序 (ssr: false, target: "static"
),并且用户可以登录,即使页面重新加载,登录也是持久的。