自定义参数装饰器,将参数转换为数据库实体



在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(),这将在请求中通过id返回我的文章实体?

您可以实现一个自定义管道,该管道注入TypeORM存储库,并在提示ID时返回数据库实体,如下所示:

@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的模块上使用管道。

然后,如果你需要特定的@ article参数,它应该是这样的:
export function ArticleParam = () => applyDecorators(
Param(ArticlePipe)
)

最新更新