【问题标题】:How to retrieve currentUser data with Vue.js, Vuex, Express, MongoDB如何使用 Vue.js、Vuex、Express、MongoDB 检索 currentUser 数据
【发布时间】:2020-03-30 16:41:29
【问题描述】:

我正在尝试构建一个 MEVN 堆栈身份验证页面,该页面返回有关当前登录用户的信息。登录后,路由器重定向到 Home.vue,同时将 username 作为道具传递给 Home.vue。

Login.vue 中的onSubmit 方法

<script>
  methods: {
    onSubmit (evt) {
      evt.preventDefault()
      axios.post(`http://localhost:3000/api/auth/login/`, this.login)
        .then(response => {
          localStorage.setItem('jwtToken', response.data.token)
          this.$router.push({
            name: 'BookList',
            params: { username: this.login.username }
          })
        })
        .catch(e => {
          this.errors.push(e)
        })
      },
      register () {
        this.$router.push({
          name: 'Register'
        })
      }
    }
  }
  </script>

然后在 Home.vue 组件中分派一个 Vuex 操作,该组件将用户名传递给 store.js 中的操作处理程序

Home.vue 中的实例

import axios from 'axios'
import { mapState } from 'vuex'
export default {
  name: 'BookList',
  props: ['username'],
  data () {
    return {
      errors: []
    }
  },
  computed: mapState([
    'users'
  ]),
  created () {
    this.$store.dispatch('setUsers', this.username)
  }
}
</script>

store.js

import Vue from 'vue'
import Vuex from 'vuex'
import axios from 'axios'

Vue.use(Vuex)

export default new Vuex.Store({
  state: {
    users: [],
  },
  mutations: {
    setUsers: (state, users) => {
      state.users = users
    }
  },
  actions: {
    setUsers: async (context, username) => {
      let uri = `http://localhost:3000/api/auth/currentuser?username=${username}`
      const response = await axios.get(uri)
      context.commit('setUsers', response.data)
    }
  }
})

商店从 Express 路由设置中请求登录用户的用户名,以根据带有 username 作为查询的 URL 搜索登录用户:

http://localhost:3000/api/auth/currentuser?username=${username}

快速路线

router.get('/currentuser', function(req, res) {
  let params = {},
  username = req.query.username
  if (username) {
     params.username = username
  }
  User.find(params, function (err, users) {
    if (err) return next(err);
    res.json(users);
  });
});

登录用户的用户名检索成功并返回模板:

      <table style="width:100%">
        <tr>
          <th>Logged in User</th>
        </tr>
        <tr v-for="user in users" :key="user._id">
          <td>{{ user.username }}</td>
        </tr>
      </table>

但是...只要我刷新浏览器,用户名就会消失。知道为什么名字不会留在屏幕上吗?它与作为道具传递给 Home.vue 的用户名有关吗?而不是将用户名道具一直传递到:

http://localhost:3000/api/auth/currentuser?username=${username}

...是否有另一种方法可以将登录用户的用户名作为 URL 中的查询传递?

更新的 STORE.JS

import Vue from 'vue'
import Vuex from 'vuex'
import axios from 'axios'
import VuexPersistence from 'vuex-persist'

const vuexLocal = new VuexPersistence({
  storage: window.localStorage
})

Vue.use(Vuex)

export default new Vuex.Store({
  state: {
    users: [],
  },
  mutations: {
    setUsers: (state, users) => {
      state.users = users
    }
  },
  actions: {
    setUsers: async (context, username) => {
      let uri = `http://localhost:3000/api/auth?username=${username}`
      const response = await axios.get(uri)
      context.commit('setUsers', response.data)
    }
  },
  plugins: [vuexLocal.plugin]
})

【问题讨论】:

  • 您正在通过参数将用户名传递给您的BookList 路由。这如何成为Home.vue 中的道具? BookList 路由是什么样的?
  • 我怀疑你没有在任何地方坚持username...

标签: javascript node.js mongodb express vue.js


【解决方案1】:

在 Vue/Vuex 中,一旦刷新页面或转储缓存,状态就会被清除。如果你想持久化数据,你有几个选择。

如果您将它们存储在本地,如果您担心用户可以使用本地存储的数据做什么,最好使用令牌或其他安全措施。

【讨论】:

  • 嗨@Arc,我尝试使用您推荐的 vuex-persist 插件来持久化数据。请参阅上面的 UPDATED STORE.JS 示例。我按照 GitHub 的说明安装了插件,并将其导入到 Vuex 中。在浏览器检查工具中的Application下,我可以看到数据推送到名为vuex的本地存储键下的localstorage值。但是,一旦我刷新页面,用户的 localstorage 值就会变为空白,同时也会从应用程序的屏幕上消失。此时我应该怎么做才能持久化用户名?
  • 如果您仍然遇到其他线程中提到的问题,我只能建议确保您的设置正确。如果 localStorage 没有通过刷新保持,那一定是浏览器错误(你能在其他浏览器中重现这个吗?)或配置错误(Vuex Persist 设置正确吗?)。 npmjs.com/package/vuex-persist#steps
  • 嗨,Arc,您能看看另一个 MEVN 堆栈问题吗? stackoverflow.com/questions/60108257/…
猜你喜欢
  • 2020-03-18
  • 2019-10-01
  • 2020-12-28
  • 1970-01-01
  • 2019-01-24
  • 1970-01-01
  • 2019-01-24
  • 2020-05-10
  • 2017-05-13
相关资源
最近更新 更多