2017-08-25 14 views
0

私のサービスでは、サーバーに呼び出しを行うgetProducts()とgetProductsByType()という2つの機能がほとんど同じです。 getProductsByType()はサーバー関数を呼び出し、データを返します。 getProducts()関数は対応するサーバー関数を呼び出しますが、サーバー関数は呼び出されません。角2/Mongoose:呼び出されたサーバー関数が呼び出されていない

サービス機能:

@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); 
      } 
     }); 
}) 
+0

Hummm、console.logが表示されない(「製品の入手」を参照)ログが記録されていますか?またはconsole.log( "products =" + JSON.stringify(products))が表示されません。ログインしていますか? – Frank

+0

どちらも記録されません。 – koque

+0

私は速達を使用してから申し訳ありません。たぶん、あなたの最初のルートに対して "/ api/products/all"をマッチさせ、 "all"を引数として解釈することがあります。ルートを並べ替えたり、 "/ products /:type"ルートでnext()を呼び出そうとしたかもしれません。私は行くつもりだ、私はより多くの助けになることができなかった申し訳ありません。がんばろう! – Frank

答えて

0

まず、私はすべて/ allproductsに/「/製品からのHTTPのURLを変更しましたurl "/ products /:タイプ。これはすぐに問題を解決しませんでした。次に、以下のようにObservableを使用してPromiseを使用するように変更し、データを受信しました。 Observablesにはいくつかの奇抜があるかもしれません。 1つのインスタンスで動作し、他のインスタンスでは動作しませんでした。

@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)  
    } 

} 
関連する問題