问题
I am trying to create a React application that uses a "Login with Google" button to trigger signInWithPopup(provider)
. However each time I call new firebaseApp.auth.GoogleAuthProvider()
my console returns an error. I am simply trying to console.log()
the result
.
firebase_setup.jsUncaught TypeError: _firebase_setup2.default.auth.GoogleAuthProvider is not a constructor
import * as firebase from 'firebase';
const firebaseConfig = {
apiKey: "AIzaSyAKlWtFZvbvuNy2qC68Xt5xzaTQVyy9l2o",
authDomain: "doordash-ff045.firebaseapp.com",
databaseURL: "https://doordash-ff045.firebaseio.com",
storageBucket: "doordash-ff045.appspot.com",
};
const firebaseApp = firebase.initializeApp(firebaseConfig);
export default firebaseApp;
login.js
import React, { Component } from 'react';
import { browserHistory } from 'react-router';
import firebaseApp from '../../../services/firebase_setup';
export default class Login extends Component {
componentDidMount() {
firebaseApp.auth().onAuthStateChanged(user => {
if (user) {
console.log(user);
browserHistory.push('/profile');
}
});
}
authenticate() {
var provider = new firebaseApp.auth.GoogleAuthProvider();
provider.addScope('profile');
provider.addScope('email');
firebaseApp.auth().signInWithPopup(provider)
.then(result => {
console.log(result);
})
}
render() {
return (
<div>
<h1>Login Page</h1>
<button onClick={this.authenticate.bind(this)}>
Login with Google
</button>
</div>
);
}
}
I would appreciate any insight into this issue! I have looked up numerous tutorials but always run into the same error when attempting to declare the provider
variable.
回答1:
You're mixing namespaces with instance: the firebaseApp
is just a container for configuration data. It is not how you create a provider instance.
The proper way is:
var provider = new firebase.auth.GoogleAuthProvider();
回答2:
I ran into this "not a constructor" problem and some other errors as well. I was doing something like this:
var googleProvider = new myApp.auth.GoogleAuthProvider();
When it should have been
var googleProvider = new firebase.auth.GoogleAuthProvider();
I was also initializing my app with a name like this:
var myApp = firebase.initializeApp(appConfig, "App");
Which didn't initialize a DEFAULT app & gave me more errors. I should have done this (since I only have one app)
var myApp = firebase.initializeApp(appConfig);
回答3:
I ran into this issue as I was trying to store a reference to firebase.auth to use in multiple functions.
I found that the GoogleAuthProvider function is a property of the auth firebase function whereas the signInWithPopup, onAuthStateChanged, signOut, etc. are on the firebase.auth.Auth returned by the firebase.auth() function.
This is what my code now looks like.
//constructor
this.auth = firebase.auth;
this.auth_ = firebase.auth();
...
//sign in function
var provider = new this.auth.GoogleAuthProvider();
this.auth_.signInWithPopup(provider);
The sample code at https://codelabs.developers.google.com/codelabs/firebase-web/#5 is correct but this is a hard to notice difference when you paste this code in your solution and start messing with it.
来源:https://stackoverflow.com/questions/39397381/react-firebase-googleauthprovider-is-not-a-constructor