首页 > 解决方案 > 无法在 firebase fireStore 中添加集合

问题描述

我正在尝试在 fireBase fireStore 中添加一个集合,所以我使用了这个函数 .collection.(doc).set ;集合没有创建,控制台显示错误注册,尽管我在 firebase 的身份验证中找到了新用户,但我希望我能找到好的解决方案。我快疯了

  <div class="uk-position-small uk-position-center uk-overlay uk-overlay-default">
      <form #f="ngForm"  (ngSubmit)="register(f)">
        <div class="uk-margin">
          <div class="uk-inline">
              <span class="uk-form-icon" uk-icon="icon: happy"></span>
              <input class="uk-input" type="text" name="firstName" #firstName="ngModel" ngModel required>
              <p class="alert alert-danger" *ngIf="firstName.errors?.required && firstName.touched">this input firstName and lastName are required</p>

          </div>
      </div>


      <div class="uk-margin">
        <div class="uk-inline">
<textarea class="uk-input"   cols="28" rows="10" placeholder="bio" name="bio" #bio="ngModel" ngModel bio required></textarea>
<p class="alert alert-danger" *ngIf="bio.errors?.required && bio.touched">this bio isrequired</p>

</div>
    </div>
      <div class="uk-margin">
          <div class="uk-inline">
              <span class="uk-form-icon" uk-icon="mail"></span>
              <input class="uk-input" type="text" name="email" #email="ngModel" ngModel email required>
              <p class="alert alert-danger" *ngIf="email.errors?.required && email.touched">this input email is required</p>

          </div>
      </div>

      <div class="uk-margin">
          <div class="uk-inline">
              <span class="uk-form-icon uk-form-icon-flip" uk-icon="icon: lock"></span>
              <input class="uk-input" type="password" name="password" #password="ngModel" ngModel password required minlength="8">
              <p class="alert alert-danger" *ngIf="password.errors?.required && password.touched">this input password is required</p>
              <p class="alert alert-danger" *ngIf="password.errors?.minlength && password.touched">this input password should +8 caratere</p>
            </div>
      </div>
      <div class="uk-margin">
        <div class="uk-inline">
            <span class="uk-form-icon uk-form-icon-flip" uk-icon="icon: lock"></span>
            <input class="uk-input" type="password" name="confirmPassword" #confirmPassword="ngModel" ngModel required minlength="8">
            <p class="alert alert-danger" *ngIf="confirmPassword.errors?.required && password.errors?.minlength && confirmPassword.touched">this input confirmpassword is required</p>
            <p class="alert alert-danger" *ngIf="password.value!==confirmPassword.value && password.touched">not equal</p>
        </div>
    </div>
     <button type="submit" class="btn btn-success">Register</button>

    </form>
    </div>


        export class RegisterComponent implements OnInit {

          constructor(private as:AuthService , private fs:AngularFirestore , private route:Router) { }

  ngOnInit(): void {
  }
  register(f){
   // console.log(f.value)

   let data=f.value
    this.as.signUp(data.email,data.password ).then((user)=>{

    this.fs.collection("users").doc(user.user.uid).set({
  firstName:data.firstName,
  email:data.email,
  bio:data.bio,
  uid:data.user.user.uid
})
.then(()=>{
 console.log('done')
 // this.route.navigateByUrl('/home')
})
})
.catch(()=>{
console.log('error register')
    })
  }

}


@Injectable({
  providedIn: 'root'
})
export class AuthService {

  user: Observable<firebase.User>;

  constructor(private fa:AngularFireAuth) {
    this.user=this.fa.user
   }
  signUp(email,password){
 return this.fa.createUserWithEmailAndPassword(email,password)
  }
  signIn(email,password){
    return this.fa.signInWithEmailAndPassword(email,password)
  }

}

标签: javascriptangularfirebasegoogle-cloud-firestore

解决方案


你没有在你的链中返回承诺,所以你的代码正被它们吹走。如果这不能解决您的问题,那么问题出在您的signUp代码中,您必须发布它以获得更多帮助。

register(f){
  let data=f.value
  this.as.signUp(data.email, data.password).then((user) => {
    // You need to return this promise. Right now, your code
    // is blowing right by it and immediately calling the next `then`
    return this.fs.collection("users").doc(user.user.uid).set({
      firstName: data.firstName,
      email: data.email,
      bio: data.bio,
      uid: data.user.user.uid
    })
  }).then(() => {
    // This code block has now waited for the doc to be set
    console.log('done')
    // this.route.navigateByUrl('/home')
  }).catch((error) => {
    console.log('error register')
    console.log(error)
  })
}

推荐阅读