Angular 2 / Mongoose:未调用被调用的服务器功能

时间:2017-08-25 21:01:28

标签: angular mongoose

我的服务中有两个几乎相同的函数:getProducts()和getProductsByType(),它们调用服务器。 getProductsByType()调用服务器函数并返回数据。 getProducts()函数调用其相应的服务器函数,但从不调用服务器函数。

服务功能:

@Injectable()
export class DataService {
  private products: Product[];  

  private productsUrl: string = "/api/products/all";
  private productUrl: string = "/api/products/";

  constructor(private http: Http) { 
    this.getProducts();
  }

  public getProducts() {
    console.log("DataService.getProducts called");

    this.http.get(this.productsUrl)
    .map((response: Response) => {
      this.products = response.json();
    })
    .catch(this.handleError)    
  }

  public getProductsByType(type: string): Observable<Product[]> {
    console.log("DataService.getProductsByType called");

    return this.http.get(this.productUrl + type)
    .map((response: Response) => {
      return response.json() as Product[] || null;
    })
    .catch(this.handleError)    
  }
}

服务器功能:

router.get("/products/:type", function (req, res) {
console.log("Get product by type called")

Product.find({ "producttype": req.params.type })
    .exec(function (err, products) {
        if (err) {
            console.log("Error retrieving products: " + req.params.type);
            res.json(err);
        } else {
            // console.log("products = " + JSON.stringify(products));
            res.json(products);
        }
    });
})

router.get("/products/all", function (req, res) {
    console.log("Get product called")

    Product.find({})
        .exec(function (err, products) {
            if (err) {
                console.log("Error retrieving products");
                res.json(err);
            } else {
                console.log("products = " + JSON.stringify(products));
                res.json(products);
            }
        });
})

1 个答案:

答案 0 :(得分:0)

首先,我将http的网址从&#34; / products / all更改为/ allproducts,因为后者似乎与现有的网址&#34; / products /:类型冲突。这并没有立即解决问题。然后我将函数从使用Observable更改为使用Promise,如下所示,并收到数据。 Observable可能有一些怪癖。它在一个实例中起作用,而不是在另一个实例中起作用。

@Injectable()
export class DataService {
  private products: Product[];  

  private productsUrl: string = "/api/allproducts";

  constructor(private http: Http) { 
    this.getProducts();
  } 

 public getProducts() {
    console.log("DataService.getProducts called");

    this.http.get(this.productsUrl)
      .toPromise()
      .then((response: Response) => {
        this.products = response.json()
        console.log("DataService.products = " + JSON.stringify(this.products));
      })
      .catch(this.handleError)    
  }

}