Vuejs2 Nuxt通用应用程序。服务器端的Vuex存储在请求之间缓存,而不考虑用户';s机器

Vuejs2 Nuxt通用应用程序。服务器端的Vuex存储在请求之间缓存,而不考虑用户';s机器,vuejs2,nuxt.js,vuex,Vuejs2,Nuxt.js,Vuex,我在Nuxt Universal应用程序的生产实例中观察到以下行为: 给定“用户A”发出一个页面请求,访问nuxt的服务器端,一个服务器端方法,如异步数据在过程中调度状态更改 如果独立计算机上的“用户B”通过服务器端方法向服务器请求“用户a”先前更改的状态数据 然后“用户B”将能够访问该数据 ergonuxt将Vuex视为服务器上的单个存储区,不区分不同的调用方 是否有一种可配置的方法来防止这种行为,并坚持每个用户只能访问与其本地计算机相关的数据 [编辑] 根据要求,这是商店的index.j

我在Nuxt Universal应用程序的生产实例中观察到以下行为:


给定“用户A”发出一个页面请求,访问nuxt的服务器端一个服务器端方法,如
异步数据
在过程中调度状态更改

如果独立计算机上的“用户B”通过服务器端方法向服务器请求“用户a”先前更改的状态数据

然后“用户B”将能够访问该数据


ergonuxt将Vuex视为服务器上的单个存储区,不区分不同的调用方

是否有一种可配置的方法来防止这种行为,并坚持每个用户只能访问与其本地计算机相关的数据

[编辑] 根据要求,这是商店的index.js的近似值

从'lodash'导入{omit}
从“Vue”导入Vue
//我们起草了一些自动生成泛型getter和setter变体的方法。
//此外,默认操作是在给定名称列表的情况下设置的,自动提交给通用setter mutators。
//请参阅下面代码中的注释。。。
进口{
汽车驾驶员,
自动置换,
自动包装
}来自“~/libs/autoMap”
常数状态={
中心:{id:-1},
电子邮件:'foo@bar.com',
barApiUrl:process.env.FooUrl+'/foo',
barDownloadImg:process.env.FooUrl+process.env.FooImg,
barDownloadLockImg:process.env.FooUrl+process.env.FoobarDownloadLockImg,
愚弄者:process.env.FooUrl+'/foo/auth',
FooBarUrl:process.env.FooUrl+'/bar',
FooUrl:process.env.FooUrl,
加载:false,
警告:{}
}
导出默认值{
州:()=>(_州),
吸气剂:自动吸气剂(_state{
foo:(state)=>state.foo.someSpecialProperty?{foo:'我不同'}:{},
etc:(状态)=>etc
//例如,自动引导器将设置:
//中心:(州)=>state.center
}), 
突变:自动突变(_状态{
clearWarning(_state,key){Vue.delete(_state.warnings,key)},
clearWarnings(_state){{u state.warnings={},
setWarning({u state,{key,value}){{u state.warnings[key]=value}
//例如,自动置换将生成:
//setcenter(state,center){state.center=center}
}),
措施:自动打包(_状态{
//特别行动,在服务器端启动------------------------------------
nuxtServerInit({state,commit,getter,dispatch},{params}){
调度('foo-module/resetAll')
调度('foo-module/resetmainformation')
},
//正常动作----------------------------------------------------------
clearCentre({commit}){commit('setcenter',{id:-1})},
setcenter({commit,dispatch},center){
提交('setcenter',省略(center,'user'))
调度('bar-module/setUser',centre.user)
},
clearWarning({commit},key){commit('clearWarning',key)},
clearWarnings({commit}){commit('clearWarnings')},
setWarning({commit},{key,value}){commit('setWarning',{key,value})}
//例如,自动打包将生成:
//setLoading({commit},value){commit('setLoading',value)}
}, [
“加载”,
“警告”
])
}

在我看来,在文档**中不是很清楚,但您需要将存储导出为函数(显式或隐式返回),而不是对象。作为函数导出将在服务器上创建新存储,而作为普通对象导出将始终返回相同的对象

**编辑:现在似乎已更新以突出显示这一点

以下是文档中的示例:

export const state = () => ({
  list: []
})
注意
()
包装对象文字

试着根据这一点调整您的代码(伪代码示例,我相信您会找到将状态传递到自动映射方法中的方法!)


你能分享一下你的商店索引吗?让我看看我是否能起草一份仿。。。你看到的是一个生产存储…我只是想看看你是否将存储导出为函数,而不是对象。如果您将其导出为对象,您将获得所描述的确切行为,这并不是nuxt bug本身——只是从Vue导出到nuxt时遇到的常见问题。啊!真是这样!也许就是这样!!那么,我是否应该将存储导出为index.js的函数?是这样吗?我刚刚检查了文档,似乎他们确实更新了文档以反映这一点。“状态值应始终是一个函数,以避免服务器端出现不需要的共享状态。”
import { omit } from 'lodash'
import Vue from 'vue'

import {
  autoMapGetters,
  autoMapMutations,
  autoMapActions
} from '~/libs/autoMap'

export const state = () => ({
  centre: { id: -1 },
  devEmail: 'foo@bar.com',
  barApiUrl: process.env.FooUrl + '/foo',
  barDownloadImg: process.env.FooUrl + process.env.FooImg,
  barDownloadLockImg: process.env.FooUrl + process.env.FoobarDownloadLockImg,
  FooLoginUrl: process.env.FooUrl + '/foo/auth',
  FooBarUrl: process.env.FooUrl + '/bar',
  FooUrl: process.env.FooUrl,
  loading: false,
  warnings: {}
})

export const getters = {
   // ... your automap method here
}

export const mutations = {
  // ... your automap method here
}

export const actions = {
  // nuxtServerInit etc ...
}