我的服务中有两个几乎相同的函数: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);
}
});
})
答案 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)
}
}