如何解决如何在NestJS中创建Rest API?
我想创建用于按名称访问产品详细信息的API,详细信息位于products.service
文件中的数组中,但是当我点击API时,我只会获取[]
,通过id而不是通过使用名称来获取数据。
products.controller
@Get()
getProducts() {
return this.productsService.getProducts();
}
@Get(':id')
getProduct(@Param() params) {
console.log('get a single product',params.id);
return this.productsService.getProducts().filter(p => p.id == params.id);
}
@Get(':name')
getProductByName(@Param() params) {
console.log('get a single product',params.name);
return this.productsService.getProducts().filter(p => p.name == params.name);
}
}
产品。服务
@Injectable()
export class ProductsService {
products = [{
id: 1,name: 'chocolate'
},{
id: 2,name: 'cadbery'
}];
getProducts() {
return this.products;
}
}
解决方法
说明
在控制器中,您的2条路由getProduct
和getProductByName
检测到与api-path/:param
相同的模式,其中param
可以表示id
或{{1 }},但Nestjs不知道如何发挥作用。
这意味着,当您使用name
或api-path/2
请求api时,Nest会调用与该模式匹配的第一个函数,在您的情况下为api-path/cadbery
。
这就是为什么只能按id而不按名称查找的原因,因为getProduct
始终执行,而getProduct
从未调用。
解决方案
仅对查询参数使用1条路由:
getProductByName
现在您可以:
- 致电
@Get() // No path param. getProducts(@Query() query) { if (query.id != null) { // Filter by id. return this.productsService.getProducts().filter(p => p.id == query.id); } else if (query.name != null) { // Filter by name. return this.productsService.getProducts().filter(p => p.name == query.name; } return this.productsService.getProducts(); // Or return all products. }
获取所有产品
- 使用
GET api-path
通过ID过滤 - 使用
GET api-path?id=2
按名称过滤
如果路线GET api-path?name=cadbery
已经在您前面的某处使用,并且您不想引入重大更改,则可以保留路线并改编getProduct
以仅按名称过滤:
getProducts
,
这是有关基础适配器如何解析查询和URL参数的古怪怪癖之一。即使您可能会发送类似GET /products/2
的邮件,并且期望返回{ id: 2,name: 'cadbery' }
,但实际上发生的是req.params.id
是以'2'
而不是{{1 }}。换句话说,即使它是一个数字,也将被解析为字符串,并且2
返回false,因此即使存在,也永远找不到合适的乘积。
使用'2' === 2
可以解决此问题。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。