将参数转换为数据库实体的自定义参数装饰器
Custom param decorator which transform param to database entity
在 Laravel (php) 中有路由 /article/:article,在控制器方法中我得到模型:
function getArticle(ArticleModel $article) {...}
如何在 NestJS 中实现?
我的控制器:
@Controller('/articles')
export class ArticlesController {
@Get('/:article/edit')
editArticle(@Param('article') articleId: number) {...}
}
如何将 @Param('article') 转换为自定义装饰器 @ArticleParam() ,这将 return 我的 Article 实体按请求中的 id?
您可以实现自定义管道,在提示输入 ID 时注入 TypeORM 存储库和 returns 数据库实体,如下所示:
@Injectable()
export class ArticlePipe implements PipeTransform {
constructor(@InjectRepository(Article) private repository: Repository<Article>) {}
transform(value: id, metadata: ArgumentsMetadata): Promise<Article|null> {
return this.repository.findOneBy({ id });
}
}
然后像这样使用它
@Get('/article/:id')
getArticle(@Param('id', ArticlePipe) article: Article) { ... }
您只需确保仅在提供 Article EntityRepository 的模块上使用管道。
那么,如果你需要具体的@ArticleParam,应该是这样的:
export function ArticleParam = () => applyDecorators(
Param(ArticlePipe)
)
在 Laravel (php) 中有路由 /article/:article,在控制器方法中我得到模型:
function getArticle(ArticleModel $article) {...}
如何在 NestJS 中实现? 我的控制器:
@Controller('/articles')
export class ArticlesController {
@Get('/:article/edit')
editArticle(@Param('article') articleId: number) {...}
}
如何将 @Param('article') 转换为自定义装饰器 @ArticleParam() ,这将 return 我的 Article 实体按请求中的 id?
您可以实现自定义管道,在提示输入 ID 时注入 TypeORM 存储库和 returns 数据库实体,如下所示:
@Injectable()
export class ArticlePipe implements PipeTransform {
constructor(@InjectRepository(Article) private repository: Repository<Article>) {}
transform(value: id, metadata: ArgumentsMetadata): Promise<Article|null> {
return this.repository.findOneBy({ id });
}
}
然后像这样使用它
@Get('/article/:id')
getArticle(@Param('id', ArticlePipe) article: Article) { ... }
您只需确保仅在提供 Article EntityRepository 的模块上使用管道。
那么,如果你需要具体的@ArticleParam,应该是这样的:
export function ArticleParam = () => applyDecorators(
Param(ArticlePipe)
)