1

我已驗證我的用戶,我有一個用戶。但是,當我嘗試使用建議的代碼從火力地堡寫入數據庫,驗證firebase中的用戶與反應原生Onauth不是一個功能

var isNewUser = true; 

var ref = new Firebase("https://<YOUR-FIREBASE-APP>.firebaseio.com"); 
ref.onAuth(function(authData) { 
    if (authData && isNewUser) { 
    // save the user's profile into the database so we can list users, 
    // use them in Security and Firebase Rules, and show profiles 
    ref.child("users").child(authData.uid).set({ 
     provider: authData.provider, 
     name: getName(authData) 
    }); 
    } 
}); 

// find a suitable name based on the meta info given by each provider 
function getName(authData) { 
    switch(authData.provider) { 
    case 'password': 
     return authData.password.email.replace(/@.*/, ''); 
    case 'twitter': 
     return authData.twitter.displayName; 
    case 'facebook': 
     return authData.facebook.displayName; 
    } 
} 

我返回一個錯誤onAuth不是一個函數。

我認爲這可能是一個問題,通過道具傳遞Firebase,所以註銷了幾條路徑,看看我能否找到函數onAuth但不能。有什麼建議麼?因爲我只是測試相關的代碼可以在componentWillMount函數中的account.js中找到。

登錄。 JS

'use strict'; 
import { 
    AppRegistry, 
    Text, 
    TextInput, 
    View, 
    TouchableHighlight, 
    ToolbarAndroid, 
    ActivityIndicator 
} from 'react-native'; 
import React, {Component} from 'react'; 
import Signup from './Signup'; 
import Account from './Account'; 
import styles from '../styles/baseStyles.js'; 

export default class Login extends Component { 

    constructor(props){ 
    super(props); 
    // We have the same props as in our signup.js file and they serve the same purposes. 
    this.state = { 
     loading: false, 
     email: '', 
     password: '' 
    } 
    } 

    render() { 
    // The content of the screen should be inputs for a username, password and submit button. 
    // If we are loading then we display an ActivityIndicator. 
    const content = this.state.loading ? <ActivityIndicator size="large"/> : 
     <View> 
     <TextInput 
      style={styles.textInput} 
      onChangeText={(text) => this.setState({email: text})} 
      value={this.state.email} 
      placeholder={"Email Address"} /> 
     <TextInput 
      style={styles.textInput} 
      onChangeText={(text) => this.setState({password: text})} 
      value={this.state.password} 
      secureTextEntry={true} 
      placeholder={"Password"} /> 
     <TouchableHighlight onPress={this.login.bind(this)} style={styles.primaryButton}> 
      <Text style={styles.primaryButtonText}>Login</Text> 
     </TouchableHighlight> 
     <TouchableHighlight onPress={this.goToSignup.bind(this)} style={styles.transparentButton}> 
      <Text style={styles.transparentButtonText}>New here?</Text> 
     </TouchableHighlight> 
     </View>; 

    // A simple UI with a toolbar, and content below it. 
    return (
     <View style={styles.container}> 
     <View style={styles.body}> 
      {content} 
     </View> 
     </View> 
     ); 
    } 

    login(){ 
    this.setState({ 
     loading: true 
    }); 
    // Log in and display an alert to tell the user what happened. 
    this.props.firebaseApp.auth().signInWithEmailAndPassword(this.state.email, this.state.password 
    ).then((userData) => 
     { 
     this.setState({ 
      loading: false, 
      username:"mone" 
      }); 
     this.props.navigator.push({ 
      component: Account 
     }); 
     } 
    ).catch((error) => 
     { 
      this.setState({ 
      loading: false 
      }); 
     alert('Login Failed. Please try again' + error.message); 
    }); 
    } 

    // Go to the signup page 
    goToSignup(){ 
    this.props.navigator.push({ 
     component: Signup 
    }); 
    } 
} 

AppRegistry.registerComponent('Login',() => Login); 

main.js

import React, { Component } from 'react'; 
'use strict'; 
import { 
    AppRegistry, 
    Text, 
    StyleSheet, 
    ActivityIndicator, 
    View, 
    Navigator, 
} from 'react-native'; 

import Login from '../login/pages/Login'; 
import Account from '../login/pages/Account'; 

import * as firebase from 'firebase'; 

const firebaseConfig ={ 
    apiKey: "AIzaSyAaJuCW0nsMLqi-ke6K_bTDhBujilgWneQ", 
    authDomain: "test-app-657c0.firebaseapp.com", 
    databaseURL: "https://test-app-657c0.firebaseio.com", 
    storageBucket: "test-app-657c0.appspot.com", 
    messagingSenderId: "215519929651" 
    }; 


const firebaseApp = firebase.initializeApp(firebaseConfig); 


import styles from '../login/styles/baseStyles.js'; 

class Main extends Component { 
    constructor(props){ 
    super(props); 
    this.state = { 
     // the page is the screen we want to show the user, we will determine that 
     // based on what user the firebase apI returns to us. 
     page: null 
    }; 
    } 

    componentWillMount(){ 
    // We must asynchronously get the auth state, if we use currentUser here, it'll be null 
    const unsubscribe = firebaseApp.auth().onAuthStateChanged((user) => { 
     // If the user is logged in take them to the accounts screen 
     if (user != null) { 
     this.setState({page: Account}); 
     return; 
     } 
     // otherwise have them login 
     this.setState({page: Login}); 
     // unsubscribe this observer 
     unsubscribe(); 
    }); 


    } 



    render() { 
    if (this.state.page) { 
     return (
     // Take the user to whatever page we set the state to. 
     // We will use a transition where the new page will slide in from the right. 
     <Navigator 
      initialRoute={{component: this.state.page}} 
      configureScene={() => { 
      return Navigator.SceneConfigs.FloatFromRight; 
      }} 
      renderScene={(route, navigator) => { 
      if(route.component){ 
       // Pass the navigator the the page so it can navigate as well. 
       // Pass firebaseApp so it can make calls to firebase. 
       return React.createElement(route.component, { navigator, firebaseApp}); 
      } 
     }} /> 
    ); 
    } else { 
     return (
     // Our default loading view while waiting to hear back from firebase 
     <View style={styles.container}> 
      <View style={styles.body}> 
      <ActivityIndicator size="large" /> 
      </View> 
     </View> 
    ); 
    } 
    } 
} 

module.exports = Main; 

帳戶

'use strict'; 
import { 
    AppRegistry, 
    StyleSheet, 
    Text, 
    View, 
    Image, 
    TouchableHighlight, 
    ToolbarAndroid 
} from 'react-native'; 
import React, {Component} from 'react'; 
import Login from './Login'; 
import styles from '../styles/baseStyles.js'; 

// Styles specific to the account page 
const accountStyles = StyleSheet.create({ 
    email_container: { 
    padding: 20 
    }, 
    email_text: { 
    fontSize: 18 
    } 
}); 

export default class Account extends Component { 

    constructor(props) { 
    super(props); 
    this.state = { 
     loading: true, 
    } 
    } 

    componentWillMount() { 
    // get the current user from firebase 
    const userData = this.props.firebaseApp.auth().currentUser; 
    this.setState({ 
     user: userData, 
     loading: false 
    }); 

    console.log(userData); 

    console.log(this.props.firebaseApp) 

    console.log(this.props.firebaseApp.auth()) 

     var isNewUser = true; 

     var ref = this.props.firebaseApp; 
     ref.onAuth(function(authData) { 
     if (authData && isNewUser) { 
      // save the user's profile into the database so we can list users, 
      // use them in Security and Firebase Rules, and show profiles 
      ref.child("users").child(authData.uid).set({ 
      provider: authData.provider, 
      name: getName(authData) 
      }); 
     } 
     }); 
     // find a suitable name based on the meta info given by each provider 
     function getName(authData) { 
     switch(authData.provider) { 
      case 'password': 
      return authData.password.email.replace(/@.*/, ''); 
      case 'twitter': 
      return authData.twitter.displayName; 
      case 'facebook': 
      return authData.facebook.displayName; 
     } 
     } 



    } 

    render() { 
    // If we are loading then we display the indicator, if the account is null and we are not loading 
    // Then we display nothing. If the account is not null then we display the account info. 
    const content = this.state.loading ? <ActivityIndicator size="large"/> : 
     this.state.user && 
     <View style={styles.body}> 
      <View style={accountStyles.email_container}> 
      <Text style={accountStyles.email_text}>{this.state.user.email}</Text> 
      </View> 
      <TouchableHighlight onPress={this.logout.bind(this)} style={styles.primaryButton}> 
      <Text style={styles.primaryButtonText}>Logout</Text> 
      </TouchableHighlight> 

      <TouchableHighlight onPress={this.logout.bind(this)} style={styles.primaryButton}> 
      <Text style={styles.primaryButtonText}>Logout</Text> 
      </TouchableHighlight> 
     </View> 
     ; 
    return (
     <View style={styles.container}> 
     <View style={styles.body}> 
      {content} 
     </View> 
     </View> 
    ); 
    } 

    logout() { 
    // logout, once that is complete, return the user to the login screen. 
    this.props.firebaseApp.auth().signOut().then(() => { 
     this.props.navigator.push({ 
     component: Login 
     }); 
    }); 
    } 
} 

AppRegistry.registerComponent('Account',() => Account); 

回答

相關問題