Javascript 如何在nestjs中正确使用Observable?

Javascript 如何在nestjs中正确使用Observable?,javascript,nestjs,Javascript,Nestjs,我正在开发一个可以帮助用户(为了简单起见)执行基本crud操作的API。 我得到的用户服务类似于: @Injectable() export class UsersService { constructor( @InjectRepository(User) private usersRepository: Repository<User>, ) { } ... async

我正在开发一个可以帮助用户(为了简单起见)执行基本crud操作的API。 我得到的用户服务类似于:

    @Injectable()
    export class UsersService {
        constructor(
            @InjectRepository(User)
            private usersRepository: Repository<User>,
        ) { }
...
        async findById(id: number): Promise<User> {
            return this.usersRepository.findOne(id);
    }
@Injectable()
导出类用户服务{
建造师(
@注入存储库(用户)
私有用户存储库:存储库,
) { }
...
异步findById(id:number):承诺{
返回this.usersRepository.findOne(id);
}
以及控制器:

@UseGuards(JwtAuthGuard)
@UseInterceptors(ClassSerializerInterceptor)
@UseFilters(QueryFailedExceptionFilter)
@Controller('users')
export class UsersController {

    constructor(private readonly _userService: UsersService) { }

 @Get(':id')
    findById(@Param('id', ParseIntPipe) id: number): Observable<User> {
        return from(this._userService.findById(id));
    }
@UseGuards(JwtAuthGuard)
@UseInterceptors(ClassSerializerInterceptor)
@UseFilters(QueryFailedExceptionFilter)
@控制器(“用户”)
导出类UsersController{
构造函数(私有只读用户服务:用户服务){}
@获取(':id')
findById(@Param('id',ParseIntPipe)id:number):可观察{
从(this.userService.findById(id))返回;
}
这是可行的,我可以找到、创建、删除等等。问题是,如果我试图找到一个用户(从我的控制器获取(:id),如果它不存在,它只返回一个200 ok,没有响应客户端,但它应该是一个404,因为找不到资源

阅读文档后,我理解(希望我做得对),我们可以返回一个可观察的,它将被自动转载。所以问题是,如果findOne的结果为nothing,在哪里以及如何处理,并返回一个具有适当状态的响应,当然使用可观察的

我试图找到一些例子,但我只找到了几个与承诺有关的例子,大多数情况下,他们只是忽略了notfind用户案例


PD:“他们”说,我应该在控制器中说明,如果你想返回404并使用可观测数据,你可以这样做:

@UseGuards(JwtAuthGuard)
@UseInterceptors(ClassSerializerInterceptor)
@UseFilters(QueryFailedExceptionFilter)
@控制器(“用户”)
导出类UsersController{
构造函数(私有只读用户服务:用户服务){}
@获取(':id')
findById(@Param('id',ParseIntPipe)id:number):可观察{
从(this.\u userService.findById(id)).pipe返回(
映射(用户=>{
如果(!用户){
抛出新的NotFoundException();
}
返回用户;
})
);
}

我个人喜欢将所有逻辑保留在服务中,而不是控制器中,保持控制器精简,并且大部分逻辑可重复使用。

这很快,谢谢。好的,我想我必须深入操作人员。唯一的一点是,对于异常,响应状态总是400。我知道我可以使用@Res()设置状态,但我一点也不喜欢,希望避免使用特定的库方法。顺便说一句,我同意您关于“将所有逻辑保留在服务中”的说法,但例如,如果我使用基类处理所有服务的基本操作,如查找、删除、更新,并且还希望在响应时发送自定义消息,我认为这样做是正确的控制器在这种情况下可能是正确的。我想我可以用全局异常过滤器处理异常,并在那里更改状态代码…只是不确定这是否是最佳方法。当我在本地机器上使用
NotFoundException
尝试时,我得到了正确的404。是的,你是对的。我用过滤器捕获了所有错误将response设置为400(我更改为我想要处理的特定异常,现在它工作了),这是我的错误。非常感谢。