【发布时间】:2018-01-12 12:48:19
【问题描述】:
我创建了 angular5 应用程序,我需要在其中显示所选产品的详细信息,我正在使用 express-nodejs api 从 mongodb 获取数据,但没有获取如何读取查询字符串...或者什么是正确的方法在同一个 api 中读取请求参数。
ngApi-prdDetails/server.js
var express = require('express');
var mongodb = require('mongodb').MongoClient;
var app = express();
var port = process.env.PORT||3000;
var commanRouter = express.Router();
commanRouter.route('/getPrdDetails')
.get(function(req,res){
/*----NOT GETTING prdId---*/
let prdId = req.query.ProductId;
//let prdId = 1008; //-----SHOWING EXPECTED RESULT---//
var url = 'mongodb://xyz:xyz@ds127536.mlab.com:27536/dbxyz'
mongodb.connect(url, (err, db) => {
if (err) {
return console.log(err);
}
let mydb = db.db("dbxyz");
let queryM = {"ProductId":prdId};
mydb.collection('products').find(queryM).toArray(
function(err,data){
if(err)
res.status(500).send(err);
else
res.setHeader('Access-Control-Allow-Origin','*')
res.setHeader('Access-Control-Allow-Headers','Origin,X-Requested-With,Content-Type,Accept')
res.json(data);
})
})
});
app.use('/api', commanRouter);
app.get('/',function(req,res){
res.send("Working");
});
app.use(express.static(__dirname + '/public'));
app.listen(port, function(){
console.log("running");
});
product-details.service.ts
@Injectable()
export class ProductService{
private _prdDetailsUrl= "https://abc-xyz-12345.herokuapp.com/api/getPrdDetails";
constructor(private _http:Http){ }
getProductDetails(productId:number):Observable<IProduct[]>{
let apiURL = `${this._prdDetailsUrl}?ProductId=${productId}`;
return this._http.get(apiURL)
.map((response:Response)=> <IProduct[]>response.json())
.catch(this.handleError);
}
private handleError(error:Response){
return Observable.throw(error.json().error || "Server Error!");
}
}
product-details.component.ts
import { Component, OnInit } from '@angular/core';
import { ActivatedRoute, Router } from '@angular/router';
import { ProductService } from './product.service';
import { IProduct } from './product';
@Component({
templateUrl:'./product-details.component.html',
styleUrls:['./product-details.component.css']
})
export class ProductDetailsComponent{
products:IProduct[];
errorMessage:string;
pId:number;
constructor(private _route:ActivatedRoute,
private _productService:ProductService){
}
ngOnInit():void{
console.log("<<<<<<---------------------This is Product-Details:Init-------------------------->>>>>>");
let id = this._route.snapshot.params['id'];
this.pId =id;
this._productService.getProductDetails(id)
.subscribe(products => this.products = products,
error => this.errorMessage = <any>error);
}
}
【问题讨论】:
-
Express 通常是这样工作的:
/getPrdDetails/123的请求由get('/getPrdDetails/:id')处理,它将123放入req.query.id中 -
也试过了,不知道为什么它会返回空数组,当我通过硬代码'id'时它工作得很好
-
等等,Love-Kesh 是正确的,掩码参数应该以
req.params结尾。 ...编辑:我使用 urlhttp://localhost:3000/api/getPrdDetails?ProductId=3按原样测试了您的路线,它在现场有效。我所做的只是res.send(prdId);
标签: javascript node.js api express angular5