Vuex:Firebase 路由。如果语句

Posted

技术标签:

【中文标题】Vuex:Firebase 路由。如果语句【英文标题】:Vuex: Firebase routing. If statement 【发布时间】:2021-01-20 23:26:24 【问题描述】:

我正在为我的项目使用 firestore 和 vuex。 我完成了登录方法。

我要完成以下动作。

当用户第一次登录时,URL 将重定向到 /selfonboarding 以完成配置文件设置。

如果用户提交所有信息并完成配置文件设置,“proUser”集合中的状态字段设置为true。

否则,用户没有完成配置文件设置,状态保持为假,直到用户完成所有配置文件设置。

所有文档在“proUser”集合中都有“状态”字段。 所以需要一一检查状态情况。

现在,我需要条件分支。

这是我想要实现的:如果 proUser 集合具有字段“status”== true,则用户将重定向到 /dashboard/products。如果集合有 "status" == false 字段,路线将是 /selfonboarding。

问题是,当我以具有“status”== true 字段的用户身份登录时,我可以转到 /dashboard/products。

但即使我以“status”== false 的用户身份登录,路径仍然相同。

我的问题是为什么我不能将 /selfonboarding 作为“状态”== false。

这是我的登录方法。

我只想检索一个用户数据,但现在我要检索所有具有“状态”== true 的用户。

   import 'firebase/firebase-auth'
import fireApp from '@/plugins/firebase'
import router from '../../router'
const firebase = require("firebase");
require("firebase/firestore");
const db = firebase.firestore();

const state = 
    currentUser: null


const getters = 
    currentUser: state => state.currentUser


const mutations = 
    userStatus: (state, user) => 
        // if(user) 
        //   state.currentUser = user
        // 
        // else 
        //   state.currentUser = null
        // 
        user === null ? state.currentUser = null : state.currentUser = user.email
      


const actions = 
 signIn: async ( commit , user) => 
    try 
      const userData = await fireApp.auth().signInWithEmailAndPassword(
          user.email,
          user.password
      );

        var userStatus = db.collection('ProUser').where("status", "==", true)

        if(userStatus) 
            userStatus.get().then((querySnapshot) => 
                querySnapshot.forEach((doc) => 
                    console.log(doc.id, " => ", doc.data());
                    router.push("/dashboard/products");
                );
                
            )
         else 
            console.log(doc.id, " => ", doc.data());
            router.push("/selfonboarding");
        

        
    
    catch(error) 
        const errorCode = error.code
        const errorMesage = error.message
        if(errorCode === 'auth/wrong-password') 
            alert('wrong password')
         else 
            alert(errorMesage)
            
        
    ,

    signOut: async( commit ) => 
        try 
            await fireApp.auth().signOut()
        
        catch(error) 
            alert(`error sign out, $error`)
        
        commit('userStatus', null)
    


export default 
    state,
    mutations,
    getters,
    actions

登录.vue

<template>
<div>
    <img src="../img/svg/Mangosteen.png" >
    <b-card
    class="login-card"
    >
    <form action="" @submit.prevent="signIn">
    <div>
    <b-form>

        <p class="mt-3  text-center login-title">Profile</p>   
    
        <b-form-input
        id="input-3"
        v-model="email"
        type="email"
        required
        placeholder="Email"
        class="mt-5 input"
        name="email" 
        v-validate="'required|email'" 
        :class=" 'mt-5 input': errors.has('email') ">
        >
        </b-form-input>
        <p v-show="errors.has('email')" class="validate text-center"> errors.first('email') </p>
        <b-form-input
        id="input-4"
        v-model="password"
        type="password"
        required
        placeholder="Password"
        class="mt-5 input"
        name="password" 
        v-validate="'required|min:6'" 
        :class=" 'mt-5 input': errors.has('password') "
        ></b-form-input>
        <p v-show="errors.has('password')" class="validate text-center"> errors.first('password') </p>
        <error-bar :error="error"></error-bar> 

    </b-form>

    <b-button class="loginbutton-color" type="submit">Login</b-button>
    <div v-if="show">
        <b-button class="loginbutton-color" type="submit">
            <spring-spinner
                :animation-duration="3000"
                :size="27"
                color="#ff1d5e"
                class="loading"
            />
      </b-button>
    </div>
    
    </div>
    </form>
</b-card>

</div>
</template>

<script>
import fireApp from '@/plugins/firebase'
import ErrorBar from '@/components/ErrorBar'
import  SpringSpinner  from 'epic-spinners'
import store from '../store'

  export default 
    data() 
      return 
        email: '',
        password: '',
        error: '',
        show: false
      
    ,
    components: 
      ErrorBar: ErrorBar,
      SpringSpinner
    ,
    methods: 
        signIn() 
            this.show = true
            const user = 
              email: this.email,
              password: this.password
            
            store.dispatch('signIn', user)
            this.show = false
        ,

    
  
</script>

我希望有人帮助我。 谢谢

【问题讨论】:

【参考方案1】:

通过执行var userStatus = db.collection('ProUser').where("status", "==", true),您定义了一个Query,因此,在调用get() 时,您得到的是QuerySnapshot,而不是DocumentSnapshot。因此doc.exists 总是返回false,因为QuerySnapshot 没有exists 属性。

您要么需要循环QuerySnapshot(如doc 所示),要么使用QuerySnapshotdocssize 属性来检查所需的文档是否存在,具体取决于您的确切的目标。


按照以下 cmets 更新:

我了解到您想查看与用户 ID 对应的 ID 的文档。执行以下操作:

   // Get the user id (from the user object I guess)
   const userId = user.uid;
   // or maybe through  const userId = fireApp.auth().currentUser.uid;

   const proUserDocRef = db.collection('ProUser').doc(userId);
            
   proUserDocRef.get().then((doc) => 
        if (doc.exists && doc.data().status === true)) 
            router.push("dashboard/products");
         else 
            router.push("selfonboarding");
        
   )

【讨论】:

对不起,我以“status”== false 的用户身份再次尝试。然后,我也去了路径/dashboard/products。我该如何解决这个问题? 你能分享你改编的代码吗?请通过单击编辑链接使用新代码更新您的问题。请注意,您需要真正适应 if 子句。无论您在 query 定义中所做的任何更改,if (doc.exists) 都不起作用。 QuerySnapshot 没有 exists 属性。 我需要了解您到底想做什么。我不清楚您要实现什么业务逻辑以将用户重定向到另一个页面(/dashboard/productsselfonboarding)。您查询了几个文档:您如何根据那些 几个 文档来决定要重定向到的页面? 对不起,集合“proUser”有“status”字段。如果为真,用户将重定向到 /dashboard/products。如果为 false,用户将重定向到 /selfonboarding。这就是我想要实现的目标。 非常感谢! const userId = fireApp.auth().currentUser.uid;工作!我

以上是关于Vuex:Firebase 路由。如果语句的主要内容,如果未能解决你的问题,请参考以下文章

如果超时或无法访问服务器,Fire base 不会调用 onCancelled

Vue 路由器 Auth-guard 功能不检查 Vuex 存储状态

如何修复:“@angular/fire”'没有导出成员 'AngularFireModule'.ts(2305) ionic、firebase、angular

Firebase 存储上传图像不适用于亚马逊火灾(型号:Fire 7)

node_modules/@angular/fire/firebase.app.module.d.ts 中的错误?

使用@angular/fire@6.0.3 无法访问firebase.firestore.FieldValue.serverTimestamp()