【发布时间】:2019-11-27 22:54:12
【问题描述】:
使用 NodeJS、Express 和 MongoDB 构建 API,使用 JWT 和 Cookies 进行用户身份验证。 使用 store (vuex) 使用 axios 服务从 API 获取用户数据。在 store 文件夹中创建了 auth.js,创建了 fetchData 操作,该操作从后端 (axios.get(apiRoute)) 获取数据并将用户设置为状态。 想使用 nuxtServerInit 执行此操作,所以我在 store 文件夹中创建了 index.js 文件。添加了空状态和操作。 Action 包含 nuxtServerInit,它使用 dispatch() 调用 auth.js 中的 fetchData 方法。
然而,在这一切之后,它根本不起作用。例如:用户已登录,但帐户页面未使用用户数据(姓名、电子邮件、图像等)呈现。
我尝试从 auth.js 中的 fetchData 操作返回一个承诺,但没有成功。 我还尝试在 index.js 文件中设置 fetchData 操作并直接在其上调用 dispatch。
store/auth.js
// Importing Files
import axios from 'axios';
// State
export const state = () => ({
user: null
});
// Mutations
export const mutations = {
SET_USER (store, data) {
store.user = data
},
RESET_USER (store) {
store.user = null
}
};
// Actions
export const actions = {
// Fetch User Account
async fetchData ({ commit }) {
try {
const response = await axios.get('http://localhost:3000/api/v1/users/account');
commit('SET_USER', response.data.doc);
return response;
} catch (err) {
commit('RESET_USER');
}
}
};
store/index.js
// State
export const state = () => ({
});
// Actions
export const actions = {
async nuxtServerInit({ dispatch }) {
console.log('Testing');
const res = dispatch('auth/fetchData');
return res;
}
};
components/Settings.vue
<template>
<section class="data-block-wrap" v-if="user">
<BlockHeader :blockHeaderName="`Welcome Back, ${user.name.split(' ')[0]}`" btnText="More Details" />
<img :src="getPhotoUrl(user.photo)" alt="User Photo" class="user-data__image">
<p class="user-data__short-bio">{{ user.shortBio }}</p>
</section>
</template>
<script>
export default {
// Computed
computed: {
user() {
return this.$store.state.auth.user;
}
}
...
};
</script>
我希望在 Vue 组件上正确呈现用户数据,但目前它根本不起作用。渲染是静态的,没有来自数据库/api的数据显示。
编辑/更新
在 default.vue 文件(所有组件的“父”文件)中的 created() 挂钩上调用 fetchData 时,应用会正确呈现用户数据。
default.vue
<template>
<div class="container">
<TopNav />
<SideNav />
<nuxt />
</div>
</template>
// Importing Components
import TopNav from '@/components/navigation/TopNav';
import SideNav from '@/components/navigation/SideNav';
import axios from 'axios';
import { mapActions } from 'vuex';
export default {
components: {
TopNav,
SideNav
},
methods: {
// Map Actions
...mapActions('auth', ['fetchData']),
async checkUser() {
const user = await this.fetchData();
},
},
// Lifecycle Method - Created
created() {
this.checkUser();
}
}
</script>
【问题讨论】:
-
您是否检查过 fetchData 是否正在抛出,并调用了 commit('RESET_USER')?如果一切正常,您能否发布一个使用数据的组件示例?
-
是的,commit('RESET_USER') 被正确调用,因为每次在 index.js 上使用 dispatch 方法调用 fetchData 时都会抛出错误。使用用户数据使用组件更新帖子。
-
来自文档:'注意:异步 nuxtServerInit 操作必须返回一个 Promise 或利用 async/await 以允许 nuxt 服务器等待它们。 nuxtServerInit 中的
await dispatch('auth/fetchData');有帮助吗? -
@c6p 已经尝试过异步等待方法,但没有运气。不会以任何方式影响它。
标签: javascript node.js vue.js vuex nuxt.js