Nestjs在控制器中抛出空结果异常



我有一个调用服务的控件。如果服务从数据库返回一个空的负载,我想抛出一个异常。

目前我在服务中这样做:这是我目前的服务,除了一个例外。

async getPreferences(eUserId: string): Promise<UserPreferences> {
const userPreferences = await this.userPreferencesModel.findOne({
eUserId,
});
if (!userPreferences) {
throw new NotFoundException("We couldn't find your user preferences");
}
return userPreferences;
}

我希望控制器处理异常,问题是控制器响应是一个承诺。我该怎么做呢?

这是我所做的:

@Get()
async getPreferences(
@Headers('x-e-user-id') eUserId: string,
): Promise<UserPreferences> {

const userPreferences = this.userPreferencesService.getPreferences(eUserId);
console.log('userPreferences: ', userPreferences);
// Here is what I am trying to monitor...
if (userPreferences) {
throw new NotFoundException("We couldn't find your user preferences");
}
return userPreferences;
}

控制器中的console.log返回:

userPreferences:  Promise { <pending> }

现在,如果服务响应为空,则不会抛出异常。

如何监控服务结果以抛出异常

有多种方法可以解决这个问题。这里有一个.

不要在你的服务中抛出错误,只返回结果或null

async getPreferences(eUserId: string): Promise<UserPreferences | null> {
return this.userPreferencesModel.findOne({
eUserId,
});
}

然后在控制器await中为结果,您忘记了这一点。这就是为什么你看到了一个悬而未决的承诺。在结果解决后,检查是否返回了任何用户首选项,如果没有,则抛出NotFoundException

@Get()
async getPreferences(@Headers('x-e-user-id') eUserId: string): Promise<UserPreferences> {
const userPreferences = await this.userPreferencesService.getPreferences(eUserId);
if (!userPreferences) {
throw new NotFoundException("We couldn't find your user preferences");
}
return userPreferences;
}
我不会抛出NotFoundException或任何其他HTTP相关的错误从您的服务。把这个责任留给你的控制器,不要把你的服务(逻辑)绑定到HTTP错误代码上。在这里抛出不知道上下文(HTTP)正在使用它们的错误。

PS:你也可以考虑通过查询字符串或作为路由参数传递用户ID,而不是通过报头。

最新更新