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

Woo*_*000 1 nestjs

在 Laravel (php) 中有路线/article/:article,在控制器方法中我得到了模型:

function getArticle(ArticleModel $article) {...}
Run Code Online (Sandbox Code Playgroud)

如何在 NestJS 中做到这一点?我的控制器:

@Controller('/articles')
export class ArticlesController {
    @Get('/:article/edit')
    editArticle(@Param('article') articleId: number) {...}
}
Run Code Online (Sandbox Code Playgroud)

如何将 @Param('article') 转换为自定义装饰器 @ArticleParam() ,它将通过请求中的 id 返回我的 Article 实体?

Agu*_*ira 5

您可以实现一个自定义管道,该管道注入 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 });
    }
}
Run Code Online (Sandbox Code Playgroud)

然后像这样使用它

@Get('/article/:id')
getArticle(@Param('id', ArticlePipe) article: Article) { ... }
Run Code Online (Sandbox Code Playgroud)

您只需确保仅在提供 Article EntityRepository 的模块上使用管道。

然后,如果您需要特定的@ArticleParam,它应该是这样的:

export function ArticleParam = () => applyDecorators(
  Param(ArticlePipe)
)
Run Code Online (Sandbox Code Playgroud)