在Javascript中使用DTO的示例详解

 更新时间:2023年12月22日 08:23:02   作者:陈佬昔没带相机  
在我们讨论实际实现之前,让我们先介绍一下DTO,它的含义是什么,何时使用以及 javascript/nodejs 项目中对它的真正需求,需要的朋友可以参考下

什么是DTO

DTO 英文是 data transfer object 的缩写,意思为“数据传输对象”,它是指定义了一个包含一组值或字段的容器,而不是解释如何在层之间传递数据的方法。有些人混淆了定义数据库模型(Modal)和DTO,记住这句话:

DTO 是用来操作和数据传输的,而模型则是用于数据持久性的。

什么时候使用DTO?

很多开发人员在用 typescript/nodejs 开发复杂的应用程序时,都会使用 DTO 来表示他们的数据以及数据是如何传输到应用程序的各个层的。这实际上是正确的,也是必需的。

但我今天来告诉你,这也是javascript/nodejs 开发中所必需的,这样做可以防止你的代码变得糟糕!!

为什么要在 Javascript 中使用 DTO?

想象一下,你用 javascript 开发动态页面,并使用 nodejs 开发rest API,你开始创建模型,做数据验证,例如使用“express-validator”,并定义了你的路由、中间件,一起工作正常。

随着需求的变化和代码的频繁更新,会有多个服务和多个 API 以不同的方式使用同一个模型,并且在每个服务中复制一些字段,以将它们从控制器(Controller)层传递到服务(Service)层,然后传递到负责将数据持久化到数据库中的层。当一段时间后再看代码,如果已经看不明白什么数据应该传递给服务层,什么数据应该从这个服务返回,那么你就需要 DTO 了。

再想象一下,如果你在没有严格的 schema 的情况下,连接到一个作为持久性数据库或文档数据库的firebase,并且你将 json 数据作为端点,使用“express-validator”进行一些验证,并将这些数据传递到服务层,然后这个服务层将这些数据传输到持久性层,你需要的字段如下所示:

{
    username: String,
    email: String,
    password: String
}

你如何保证 API 消费者可以发送更多的字段而不是定义的字段?例如,API 的消费者可以发送以下数据:

{
  "username": "test",
  "email": "test@gmail.com",
  "password": "specificPass",
  "birthDate": "2022-05-09T20:12:13.318Z"
}

你看,我可以发送验证中未定义的字段birthDate,这将违反服务的约定,这些数据也会被传递到持久层,并将保存在数据库中。

同样,假设有一个使用相同服务层的 API 和 web socket 连接,要如何定义两者的验证?你最终可能会在两者中重复定义公开的数据!

在所有这些情况下,您都需要DTO。其背后的想法很简单,它使你能够描述如何在层中接收数据和公开数据。

实施和示例

最初,我们将 express js 路由定义如下:

router.post("/user/register", validations, registerController);

我们将使用express验证器进行如下验证:

const validations = [
  body("username").exists().isString().notEmpty(),
  body("email").exists().isEmail(),
  body("password").exists().isString().notEmpty(),
]

然后,控制器/处理程序如下所示:

const registerController = (req, res) => {
  const result = await userService.registerUser(req.body);
  return res.status(200).json(result);
}

简单服务层如下所示:

const registerUser = (userData) => {
  userPersistenceLayer.add(userData);
}

现在,让我们定义我们的基本DTO,但在此之前,让我确保两个事实:

  • DTO用于数据传输,数据库模型用于数据持久性。
  • 将DTO视为一种约定,您可以使用此约定规范与其他人进行处理。约定规范是其中定义的字段
class RegisterUserDTO{
  username;
  email;
  password;
​
  constructor(data) {
    this.username = data.username;
    this.email = data.email;
    this.password = data.password;
  }
}

然后我们可以回到服务层并使用我们定义的DTO:

const registerUser = (userData) => {
  userPersistenceLayer.add(new RegisterUserDTO(userData));
}

正如您在这个模式中看到的那样,我们正在控制传递数据的方式,并确保哪些字段被传递到其他层,我们还可以在这个DTO中设置一些getter和setter,以根据需要序列化/转换一些数据。

希望你能清楚、顺利地了解DTO模式。

到此这篇关于浅聊为什么在Javascript中使用 DTO的文章就介绍到这了,更多相关在Javascript中使用 DTO内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • vue 组件销毁并重置的实现

    vue 组件销毁并重置的实现

    这篇文章主要介绍了vue 组件销毁并重置的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01
  • 微信小程序仿QQ头像轮播效果流程分析

    微信小程序仿QQ头像轮播效果流程分析

    这篇文章主要介绍了微信小程序仿QQ头像轮播效果流程分析,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2024-03-03
  • JavaScript事件Event对象详解(属性、方法、自定义事件)

    JavaScript事件Event对象详解(属性、方法、自定义事件)

    Event对象代表事件的状态,比如事件在其中发生的元素、键盘按键的状态、鼠标的位置、鼠标按钮的状态,这篇文章主要给大家介绍了关于JavaScript事件Event对象(属性、方法、自定义事件)的相关资料,需要的朋友可以参考下
    2024-01-01
  • JavaScript数组方法实例详解

    JavaScript数组方法实例详解

    本文将通过实例为大家详细介绍JavaScript中的数组的所有方法。文中的示例代码讲解详细,对我们深入了解JavaScript数组有一定的帮助,需要的可以参考一下
    2021-12-12
  • JS无限级导航菜单实现方法

    JS无限级导航菜单实现方法

    今天小编就为大家分享一篇关于JS无限级导航菜单实现方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • JS 自执行函数原理及用法

    JS 自执行函数原理及用法

    这篇文章主要介绍了JS 自执行函数原理及技巧,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08
  • JavaScript利用canvas实现鼠标跟随特效

    JavaScript利用canvas实现鼠标跟随特效

    canvas是一个很神奇的玩意儿,比如画表格、画海报图都要用canvas去做。本文就来利用canvas制作个简单的鼠标跟随特效,快跟随小编一起学习一下吧
    2022-10-10
  • js实现鼠标跟随运动效果

    js实现鼠标跟随运动效果

    这篇文章主要为大家详细介绍了js实现鼠标跟随运动效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-09-09
  • JavaScript数据结构中栈的应用之表达式求值问题详解

    JavaScript数据结构中栈的应用之表达式求值问题详解

    这篇文章主要介绍了JavaScript数据结构中栈的应用之表达式求值问题,详细分析了中缀表达式、后缀表达式等概念、原理与转换方法,以及基于后缀表达式实现的表达式求值相关操作技巧,需要的朋友可以参考下
    2017-04-04
  • 关于onchange事件在IE和FF下的表现及解决方法

    关于onchange事件在IE和FF下的表现及解决方法

    本篇文章主要是对关于onchange事件在IE和FF下的表现及解决方法进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助
    2014-03-03

最新评论