cookies 都是存在瀏覽器端, 而 ssr 時, 是在服務器請求的接口, 默認狀況確定帶不了瀏覽器的 cookies, 然而一些登陸後的頁面數據又必需要 cookies, 這可怎麼辦javascript
在 server.js 上引入 cookies 解析中間件vue
const cookieParser = require('cookie-parser')
而且在路由前面 usejava
app.use(cookieParser())
app.get('*', (req, res) => { // 其餘代碼省略 const context = { url: req.url, cookies: req.cookies } const renderStream = renderer.renderToStream(context) // 其餘代碼省略 })
在server-entry.js
文件中, 將 cookies 注入到 store 中node
export default context => { // 其餘代碼省略 if (context.cookies) { store.state.cookies = context.cookies } // 其餘代碼省略 }
這樣就能夠在組件中取到 cookies 了.ios
這裏以 axios 爲例, 將 cookies 加載封裝函數的參數中:
注意: 這裏的封裝, 建議將瀏覽器用的和 node 用的分開git
import axios from 'axios' const parseCookie = cookies => { let cookie = '' Object.keys(cookies).forEach(item => { cookie+= item + '=' + cookies[item] + '; ' }) return cookie } export default { get(url, params, cookies = {}) { const cookie = parseCookie(cookies) return axios({ method: 'get', url, params, headers: { 'X-Requested-With': 'XMLHttpRequest', cookie } }) } }
在組件中 dispatch vuex 的 actions:github
const fetchInitialData = async (store, config = { page: 1}) => { await store.dispatch('frontend/article/getList', config) } export default { name: 'frontend-index', prefetch: fetchInitialData, // 其餘代碼省略 }
在 vuex 的 actions 中, 從 store 裏讀取 cookies, 做爲參數傳給請求接口的函數vuex
async ['getList']({commit, rootState: {cookies}}, config) { const { data: { data, code} } = await api.get('/api/article/list', config, cookies) // 其餘代碼省略 }
1, cookies的內容中不容許帶中文, 不知道從什麼版本開始, http-server 的 header 裏有中文就直接報錯
2, import store from '../store'
這種方式下的 store 是不會帶 cookies 的express
這樣就完成了, 雖然不夠優雅, 但也總算是實現了, vue ssr 的文章真是太少了, 找資料太費勁了, 若是有更好的方法, 但願大神能不吝指正axios
完整源碼: https://github.com/lincenying...
完整實例: https://www.mmxiaowu.com/