装饰器在 Nest 控制器中返回 404

2024-03-05

我正在使用 NestJS 开发后端(顺便说一句,这很棒)。我有一个“标准获取实体情况的单个实例”,类似于下面的示例。

@Controller('user')
export class UserController {
    constructor(private readonly userService: UserService) {}
    ..
    ..
    ..
    @Get(':id')
    async findOneById(@Param() params): Promise<User> {
        return userService.findOneById(params.id);
    }

这非常简单并且有效 - 但是,如果用户不存在,服务将返回 undefined 并且控制器返回 200 状态代码和空响应。

为了让控制器返回 404,我想出了以下方法:

    @Get(':id')
    async findOneById(@Res() res, @Param() params): Promise<User> {
        const user: User = await this.userService.findOneById(params.id);
        if (user === undefined) {
            res.status(HttpStatus.NOT_FOUND).send();
        }
        else {
            res.status(HttpStatus.OK).json(user).send();
        }
    }
    ..
    ..

这是可行的,但更多的是代码(是的,它可以重构)。

这确实可以使用装饰器来处理这种情况:

    @Get(':id')
    @OnUndefined(404)
    async findOneById(@Param() params): Promise<User> {
        return userService.findOneById(params.id);
    }

有人知道有一个装饰器可以做到这一点,或者有比上面更好的解决方案吗?


做到这一点的最短方法是

@Get(':id')
async findOneById(@Param() params): Promise<User> {
    const user: User = await this.userService.findOneById(params.id);
    if (user === undefined) {
        throw new BadRequestException('Invalid user');
    }
    return user;
}

这里装饰器没有意义,因为它具有相同的代码。

Note: BadRequestException是从进口的@nestjs/common;

Edit

经过一段时间的研究,我提出了另一个解决方案,它是 DTO 中的装饰器:

import { registerDecorator, ValidationArguments, ValidationOptions, ValidatorConstraint } from 'class-validator';
import { createQueryBuilder } from 'typeorm';

@ValidatorConstraint({ async: true })
export class IsValidIdConstraint {

    validate(id: number, args: ValidationArguments) {
        const tableName = args.constraints[0];
        return createQueryBuilder(tableName)
            .where({ id })
            .getOne()
            .then(record => {
                return record ? true : false;
            });
    }
}

export function IsValidId(tableName: string, validationOptions?: ValidationOptions) {
    return (object, propertyName: string) => {
        registerDecorator({
            target: object.constructor,
            propertyName,
            options: validationOptions,
            constraints: [tableName],
            validator: IsValidIdConstraint,
        });
    };
}

然后在你的 DTO 中:

export class GetUserParams {
    @IsValidId('user', { message: 'Invalid User' })
    id: number;
}

希望它能帮助某人。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

装饰器在 Nest 控制器中返回 404 的相关文章

  • 为什么我的淘汰单选按钮在另一个具有点击绑定的元素内时会失败?

    我有一个单选按钮列表 我想要点击 li 他们还检查单选按钮 这一切都有效 直到我放了一个name单选元素上的属性 然后我的代码停止工作 我的代码如下所示 ul li li ul li
  • 使用 Android 发送 HTTP Post 请求

    我一直在尝试从 SO 和其他网站上的大量示例中学习 但我无法弄清楚为什么我编写的示例不起作用 我正在构建一个小型概念验证应用程序 它可以识别语音并将其 文本 作为 POST 请求发送到 node js 服务器 我已确认语音识别有效 并且服务
  • 如何修改每个JSON对象javascript

    我想修改里面的每个 JSON 值cooldown object cooldown user 1 This user2 0 This 在 Javascript 中使用 for 语句 我研究了好几个小时 只找到了内部的 blocks Edit
  • Three.js:缩放几何图形后错误的 BoundingBox

    在我的场景中 我有一个简单的立方体 var test new THREE Mesh new THREE CubeGeometry 10 10 10 new THREE MeshBasicMaterial scene add test 该立方
  • 如何在react-bootstrap中禁用表单提交的

    在下面的代码片段中 我有许多文本类型的输入表单 如果用户点击 我似乎会得到相同的合成事件 就像他们按下提交按钮一样 我想忽略作为表单提交 只允许一个人按下 提交 按钮 我删除了一些表单组以减少示例 在所有情况下 按钮或 ENTER 键 e
  • Chrome 中的性能问题

    我目前正在从事一个相对较大的项目 使用 AngularJs 构建 应用程序的一部分是一个表单 您可以向其中添加任意数量的页面 不幸的是 添加了很多不必要的垃圾 即表示表单模型的对象可能会变得非常大 在某些时候 Chrome 基本上无法处理它
  • 如何使用javascript将大图像转换为十六进制?

    如果我尝试将图像转换为十六进制 无论我使用哪个函数 我都会收到此错误消息 该图像的大小为 7 MB 19812 毫秒 清理 1401 2 1455 0 gt 1401 2 1455 0 MB 9 9 0 ms 自上次 GC 以来 8 3 m
  • 如何在 NestJS 中跨模块全局注入价值?

    我正在使用 nx 工作区和 Nestjs 我想在 Nestjs 应用程序的多个模块中注入一个值 最终目标是重现类似的配置管理方式Angular 中提到的 vsavkin https github com nrwl nx issues 208
  • 有没有办法使用 Rspec/Capybara/Selenium 将 javascript console.errors 打印到终端?

    当我运行 rspec 时 是否可以让 capybara selenium 向 rspec 报告任何 javascript console errors 和其他异常 我有一大堆测试失败 但当我手动测试它时 我的应用程序正在运行 如果不知道仅在
  • 尝试将数据存储在点击器网站中

    我正在尝试存储一个名为的变量score无论何时刷新 您都会一次又一次地使用它 我不明白的是它的代码是什么 我尝试了一些方法 但似乎都不起作用 这是我的答题器网站 但是当我尝试使用 JavaScript 来存储它时 它不起作用window o
  • Chrome 扩展程序在代码中使用 client_secret

    我正在开发具有自己的 oAuth 授权的 Google Chrome 扩展 当然 我必须使用 client id 和 client secret 作为请求令牌 有什么办法可以向用户隐藏这些数据吗 由于此请求只是 javascript 源代码
  • 在 HTML5 画布中,如何用我选择的背景遮盖图像?

    我试图用画布来实现这一点 globalCompositeOperation 但没有运气 所以我在这里问 这里有类似的问题 但我没有在其中找到我的案例 我的画布区域中有图层 从下到上的绘制顺序 画布底座填充纯白色 fff 用fillRect
  • window.location 和 location.href 之间的区别

    我对之间的区别感到困惑window location and location href 两者似乎都以相同的方式行事 有什么不同 window location是一个对象 它保存有关当前文档位置的所有信息 主机 href 端口 协议等 lo
  • 刷新页面时保存用户的选择

    我目前有一个页面显示不同团队的数据 我有一些数据 用户可以单击使其处于 打开 或 关闭 状态 并为每个数据显示不同的图标 它基本上就像一个清单 只是没有物理复选框 我想记住哪些 复选框 已被选中 即使在用户刷新页面或关闭浏览器并稍后返回之后
  • Firebase 函数 onWrite 未被调用

    我正在尝试使用 Firebase 函数实现一个触发器 该触发器会复制数据库中的一些数据 我想观看所有添加的内容votes user vote 结构为 我尝试的代码是 const functions require firebase func
  • 正则表达式 - 从 markdown 字符串中提取所有标题

    我在用灰质 https www npmjs com package gray matter 以便将文件系统中的 MD 文件解析为字符串 解析器产生的结果是这样的字符串 n Clean er ReactJS Code Conditional
  • 日期出现奇怪的错误,“未捕获非法访问”

    所以我试图找到最新的DateJavascript 可以处理 我把它减少到 9 月 275760 并增加了我开始捕获未捕获的天数illegal access例外new Date 09 24 275760 to new Date 10 13 2
  • 代码镜像错误:未捕获错误:扩展集中无法识别扩展值([对象对象])

    全部 我目前正在从事一个React Electron项目 该项目的目标是完成一个Markdown编辑器 当我配置codemirror 该程序报告错误说 Uncaught Error Unrecognized extension value
  • 对于只触及我的工作表的 Google 表格脚本,收到“此应用程序未经验证”

    我正在编写一个 Google Sheets 脚本 我只想访问与 gs 文件关联的同一电子表格中的数据 似乎我应该有权在自己的电子表格中运行脚本 但是每当我运行一个函数时 我都会得到一个This app isn t verified信息 我该
  • Javascript - 水波纹效果

    我需要 JS 上的脚本 它将以 水波纹 样式更改 images html 抱歉 6MB GIF 文件 http fcuunited ru temp listening2 gif http fcunited ru temp listening

随机推荐

  • 如何在 URL 中传递 Javascript 变量?阿贾克斯

    我试图在我使用的 url 中传递 accesstoken 和 pageid 的值 有什么想法如何正确地做到这一点吗
  • 文档中哪里说 while 测试 readdir 的定义?

    也可以看看 readdir 的 0 结果在 while 条件下如何不为 false https stackoverflow com questions 843430 how is 0 result from readdir not fals
  • VarBinary 到图像 url

    我正在将 Base64 图像转换为byte 并将其存储在varbinarySQL Server 中的列 我想从数据库获取图像并将其设置为 ASP NET 的图像 urlimage 我怎样才能做到这一点 将图像写入数据库的代码 string
  • 在不同行上选择满足不同条件的值

    假设我有一个像这样的两列表格 userid roleid 1 1 1 2 1 3 2 1 我想获得所有不同的用户 IDroleids1 2 AND 3 使用上面的示例 我想要返回的唯一结果是userid1 我该怎么做 好吧 我对此投了反对票
  • 使用 wingrep 搜索 IP 地址

    我正在使用 WinGrep 在 txt 文件中搜索 IP 地址 但我不知道如何让它使用正则表达式进行搜索 有人对这个有经验么 如果您不需要考虑 IPv6 只需要没有端口号的数字 IP 地址 并且不需要验证地址 即不匹配非法地址行321 45
  • Spring MVC 控制器返回 HTML

    我在尝试将 HTML 返回到 Spring MVC 控制器时遇到问题 它看起来像这样 RequestMapping value QUESTION GROUP CREATE URL method RequestMethod POST publ
  • Node.js 上的多个服务器

    我需要在同一个 Nodejs 实例上模拟四个服务器 具有不同的主机和端口 一个例子可以是 域1 8000 域2 8010 域名3 8020 域4 8030 有人可以帮我吗 谢谢 我添加了一个示例 其中包含使用节点的 2 个服务器的可能解决方
  • Java 8 中的多个 null 检查

    我有下面的代码 对于多个空检查来说有点难看 String s null if str1 null s str1 else if str2 null s str2 else if str3 null s str3 else s str4 所以
  • Scala 类型系统的优点

    我正在探索 Scala 语言 我经常听到的一个说法是 Scala 有一个stronger类型系统优于 Java 我认为人们的意思是 scalac拒绝某些有缺陷的程序javac会愉快地编译 只会导致运行时错误 某些不变量可以在 Scala 程
  • Windows批处理文件:多个if条件

    有没有办法说类似的话 if 1 1 or 1 2 在批处理文件中 或者 如果我可以指定一组候选值 例如 if 1 in 1 2 3 4 20 事实证明 and 很简单 只是不是你期望的语法 这3个例子就说明了这一点 换句话说 If 1 1
  • iPhone - UIImageView 中的中心 UIImage

    我有一个 UIImageView 我从 URL 获取 UIImage 图像显示在 UIImageView 中 但我无法使其正确居中 UIImage 为 80 x 68 像素 UIImaveView 的大小为 90 x 90 当我在 UIIm
  • 如何使用来自不同 ViewController 的 JSON 响应填充 UITableView?

    我在 stackoverflow com 上进行了谷歌搜索 但无法摆脱这种情况 如何使用 GET 的响应来填充 TableView 我发送 GET 并在 DetailViewController 我的主控制器 中的方法中解析响应 并希望使用
  • 选择 LINQ 中 JOIN 后的所有列

    我有两张桌子 Table1 and Table2 我想执行左外连接 var myOutput from object1 in Table1 join object2 in Table2 on object1 Property1 equals
  • 批处理文件日/月/年语法?

    我找不到用于提取当前日 月 年的批处理文件语法的简单细分 我有以下语法来声明用作目录名称的变量 set folder date 10 4 date 7 2 date 4 2 任何人都可以阐明 或发布链接 波浪号 双百分比的含义吗 我似乎无法
  • 在 Android 4.x 上 touchmove 后 Touchend 未触发?

    我正在用 Javascript 编写一些代码 如下所示 var el document getElementById some div el ontouchstart function e el innerHTML touch start
  • 处理具有共同属性但不同对象类型的对象的方法

    我有大量自动生成的对象 尽管它们都是不同的 不相关的类 但所有对象都共享一些基本属性 名称 id 等 我无法控制这些对象的生成 因此不幸的是我无法采取实现接口的理想方法 我想创建一种方法 在其中传递这些对象中的任意一个 并使用这些公共属性执
  • 在 Intellij 中查找 lombok 生成的构造函数的用法

    我有一个带有 lombok 注释的类 Value or Data 并且我正在寻找一种简单的方法来查找自动生成的构造函数的用法 我现在能做的就是找到构造函数的一种用法 将光标放在那里并运行 查找用法 命令 然后我得到我想要的结果 不过我想直接
  • Zurb Foundation _global.scss js 元样式?

    我当时正在开发一个 Foundation 5 项目 结果发现该项目有一个过时的 global scss 组件 我试图得到范围滑块 http foundation zurb com docs components range slider h
  • 如何使用 pymongo 获取 mongo 实例中所有数据库的列表

    如何使用 pymongo 将 mongo 实例中所有数据库的列表获取到变量 例如使用 pymongo 将以下命令发送到 mongo 实例 db adminCommand listDatabases 1 Use 数据库名称 https api
  • 装饰器在 Nest 控制器中返回 404

    我正在使用 NestJS 开发后端 顺便说一句 这很棒 我有一个 标准获取实体情况的单个实例 类似于下面的示例 Controller user export class UserController constructor private