Javascript firebase的密钥存在问题-从我的接口返回未定义

Javascript firebase的密钥存在问题-从我的接口返回未定义,javascript,angular,firebase,firebase-realtime-database,angularfire,Javascript,Angular,Firebase,Firebase Realtime Database,Angularfire,所以我在Mosh Hamedami做在线课程。我或多或少都在关注它,但一切都在运转。我可以将产品添加到Firebase并编辑/删除它们。 现在我想实现一个“购物车”,在这里我可以添加一个特定的CardId,并向该CardId添加项目+数量 然而,我面临一个问题,我想在firebase购物车中添加一个产品。添加带有cartId时间戳的购物车是有效的。 不知何故,我无法将项目添加到cartId 我想我对可观察到的有点问题 控制台错误为: _core.js:6260 ERROR Error: Unca

所以我在Mosh Hamedami做在线课程。我或多或少都在关注它,但一切都在运转。我可以将产品添加到Firebase并编辑/删除它们。 现在我想实现一个“购物车”,在这里我可以添加一个特定的CardId,并向该CardId添加项目+数量

然而,我面临一个问题,我想在firebase购物车中添加一个产品。添加带有cartId时间戳的购物车是有效的。 不知何故,我无法将项目添加到cartId

我想我对可观察到的有点问题

控制台错误为:

_core.js:6260 ERROR Error: Uncaught (in promise): TypeError: Cannot read property 'key' of undefined
TypeError: Cannot read property 'key' of undefined_
at ShoppingCartService.<anonymous> (shopping-cart.service.ts:51)

另外,我的编译器告诉我take form.pipe(take(1))是:

_错误TS2684:类型为“void”的“this”上下文不可分配给类型为“Observable”的方法的“this”

不知何故,pipe(first())工作正常,但密钥也存在同样的问题

我已经试了很多次了,但还是不能找出我的错误。我也是个新手,所以我真的很感激任何一种我必须寻找问题的技巧

购物车.service.ts

import {Injectable} from '@angular/core';
import {AngularFireDatabase} from "@angular/fire/database";
import {Product} from "./models/product";
import 'rxjs/add/operator/take';
import {take} from "rxjs-compat/operator/take";
import {pipe} from "rxjs";
import {Observable} from "rxjs";
import {first} from "rxjs/operators";


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

  constructor(private db: AngularFireDatabase) {
  }

  //create shopping cart in db + add date(timestamp)
  private create() {
    return this.db.list("/shopping-carts").push({
      dateCreated: new Date().getTime()
    });
  }

  private getCart(cartId: string) {
    return this.db.object('/shopping-carts/' + cartId);
  }

  private getItem(cartId: string, productId: string) {
    return this.db.object('/shopping-carts/' + cartId + '/items/' + productId);
  }

  //getting reference to shopping cart
  private async getOrCreateCartId(): Promise<string> {

    let cartId = localStorage.getItem('cartId');
    if (cartId) return cartId;
    // calls this.create and waits for the response
    let result = await this.create();
    //saves cartId in local storage and returns
    localStorage.setItem('cartId', result.key);
    return result.key;
  }

  //add new product to cart and safe localstorage
  async addToCart(product: Product) {
    const cartId = await this.getOrCreateCartId();
    //reference to products in firebase cart
    const item$ = this.getItem(cartId, product.key);

    item$.snapshotChanges().pipe(take(1)).subscribe((item: any) => {
      if (item) {
        item$.update({product: product, quantity: (item.quantity || 0) + 1});
      }
    });
  }
}
export interface Product {
  key : string;
  title : string;
  price : number;
  category : string;
  imageURL : string;
}
调用addToCart的html:

<div class="columns is-multiline is-narrow">
  <ng-container *ngFor="let p of filteredProductsByCategory">
    <div class="column is-one-third">
      <div class="card">
        <figure class="image is-square">
          <img [src]="p.imageURL" alt="{{p.title}}">
        </figure>
      </div>
      <div class="card-content">
        <p class="title"> {{p.title}}</p>
        <p class="subtitle">{{p.price | currency: "USD"}}</p>
        <div
             (click)="addToCart(product)"
             class="button is-outlined is-primary"> Add to Cart</div>
      </div>
    </div>
  </ng-container>
</div>


{{p.title}

{p.price |货币:“美元”}

添加到购物车
如果需要,我还可以将代码上传到GitHub! 谢谢

调用
addToCart
时,很可能没有设置
产品。
您应该检查调用函数和设置产品的位置(*.component.ts或*.component.html?)

编辑:

我猜你想通过
p
而不是
产品
。请尝试以下操作:

<div
    (click)="addToCart(p)"
    class="button is-outlined is-primary"> Add to Cart</div>
添加到购物车

omg就是这样!现在一切正常。非常感谢你。
// add new product to cart and safe localstorage
async addToCart(product: Product) { ... }
<div
    (click)="addToCart(p)"
    class="button is-outlined is-primary"> Add to Cart</div>