我是 NuxtJS 的新手并且遇到了问题,我试图获取从网站登录的用户的令牌,令牌存储在 cookie 中,但是,当我启动或重新加载网站页面(使用 nuxt ssr (universal )),nuxtServerInit 应该并且确实启动,但是 req.headers.cookie 表示它未定义,因此无法将数据加载到存储中。如果我重新加载页面,cookie 仍在浏览器中并且一切正常,问题是 req.headers.cookie 是:未定义,为什么?啊哈,在开发中它工作得很好,但在生产中它不起作用(在 nuxtServerInit 中没有定义 req.headers.cookie)
我正在使用 Firebase 托管、云功能、身份验证、云 Firestore。
代码如下:
// store/index.js
import { getUserFromCookie,getUserFromSession } from '../helpers/index.js'
export const actions = {
async nuxtServerInit({ app,dispatch },{ req,beforeNuxtRender }) {
console.log('req.headers.cookie: ' + req.headers.cookie)
console.log('req.session: ',req.session)
if (process.server) {
const user = getUserFromCookie(req)
console.log('process.server: ' + process.server)
console.log('user: ',user)
if (user) {
await dispatch('modules/user/setUSER',{
name: !!user.name ? user.name : '',email: user.email,avatar: !!user.picture ? user.picture : '',uid: user.user_id
})
await dispatch('modules/user/saveUID',user.user_id)
} else {
await dispatch('modules/user/setUSER',null)
await dispatch('modules/user/saveUID',null)
}
}
}
}
// helpers/index.js
import jwtDecode from 'jwt-decode'
var cookieparser = require('cookieparser')
export function getUserFromCookie(req) {
if(req.headers.cookie){
const parsed = cookieparser.parse(req.headers.cookie)
const accessTokenCookie = parsed.access_token
if (!accessTokenCookie) return
const decodedToken = jwtDecode(accessTokenCookie)
if (!decodedToken) return
return decodedToken
}
return null
}
// pages/auth/signup.vue
<script>
import { mapactions } from 'vuex'
export default {
data () {
return {
email: '',password: '',renderSource: process.static ? 'static' : (process.server ? 'server' : 'client')
}
},middleware: ['handle-login-route'],methods: {
...mapactions('modules/user',[ 'login' ]),async signUp () {
try {
const firebaseUser = await this.$firebase.auth().createUserWithEmailAndPassword(this.email,this.password)
await this.writeUserData(firebaseUser.user.uid,firebaseUser.user.email)
await this.login(firebaseUser.user)
this.$router.push('/protected')
} catch (error) {
console.log(error.message)
}
},writeUserData (userId,email) {
const db = this.$firebase.firestore()
return db.collection("Usuarios").doc(userId).set({
email: email
})
}
}
}
</script>
// store/modules/user.js
export const actions = {
async login({ dispatch,state },user) {
console.log('[STORE actIONS] - login')
const token = await this.$firebase.auth().currentUser.getIdToken(true)
const userInfo = {
name: user.displayName,avatar: user.photoURL,uid: user.uid
}
Cookies.set('access_token',token) // saving token in cookie for server rendering
await dispatch('setUSER',userInfo)
await dispatch('saveUID',userInfo.uid)
console.log('[STORE actIONS] - in login,response:',status)
},async logout({ commit,dispatch }) {
console.log('[STORE actIONS] - logout')
await this.$firebase.auth().signOut()
Cookies.remove('access_token');
commit('setUSER',null)
commit('saveUID',null)
},saveUID({ commit },uid) {
console.log('[STORE actIONS] - saveUID')
commit('saveUID',uid)
},setUSER({ commit },user) {
commit('setUSER',user)
}
}
非常感谢! :D