在传统的 Node.js web 应用中,Joi 是一个常用的数据验证库。但是当我们开始使用 Fastify 和 TypeScript 时,Joi 就变得不那么必要了,因为 Fastify 已经提供了一些高效的验证工具。
在本篇文章中,我们将介绍 Fastify 和 TypeScript 在数据验证方面的强大能力。
什么是 Fastify?
Fastify 是一个高效、低开销、快速构建的 Web 框架。它基于底层的 HTTP 线程而不是使用 JavaScript 运行时的回调函数或生成处理函数的函数组合来工作。Fastify 可以在极小的内存消耗下处理大量的请求和响应,并且非常适合构建高性能的 Web 应用程序。
什么是 TypeScript?
TypeScript 是 JavaScript 的一个超集,它可以在开发过程中提供类型安全、静态代码分析等功能,并帮助开发人员更好地理解代码。TypeScript 是一种流行的语言,它可以通过 npm 安装,方便地与其他 JavaScript 库和框架一起使用。
验证数据
在验证数据方面,Fastify 结合 TypeScript 提供了一些很好的选项。通常,我们需要在处理多种数据类型并且需要验证某些数据时使用验证工具。以前,我们会使用 Joi 或类似的库。但是,当你开始使用 TypeScript 时,你可以使用 TypeScript 自带的类型验证很多的数据类型。例如,你可以使用 TypeScript 内置的类型验证来验证字符串、数字、对象等。
基本类型验证
例如,要验证一个值是否为字符串,我们可以使用以下代码:
function isString(value: unknown): value is string { return typeof value === 'string’; }
代码中,isString 是一个类型谓词(Type Predicate)。这样你可以将任意类型的值传递给 isString 函数,然后它会返回一个布尔值。如果是字符串类型,结果为 true。如果不是,则结果为 false。
对象验证
我们也可以使用类型来验证对象。以下示例演示如何验证一个对象,确保它只包含所需的字段。
-- -------------------- ---- ------- --------- ----- - ----- ------- ---- ------- - -------- ------------- --------- ----- -- ----- - ------ - ------ ----- --- -------- -- ----- --- ---- -- ------ -- ----- -- ------ ---------- --- -------- -- ----- -- ----- -- ------ --------- --- -------- -- -
在此示例中,我们定义了一个类型 IUser 来表示用户,并使用一个类型谓词函数 isUser 来验证它。此函数检查该值是否为对象类型、并且是否具有所需的字段和相应的类型。
Fastify 结合 TypeScript 进行数据验证
当我们使用 Fastify 和 TypeScript 时,我们可以将这些类型验证工具与 Fastify 的一些内置功能结合使用。以下示例演示如何使用 Fastify 和 TypeScript 同时验证输入参数和响应。
-- -------------------- ---- ------- ------ -------- - ------------ - ---- ---------- --------- ----- - ----- ------- ---- ------- - ----- --- - ---------- ---------- ----- - ----- ----- - --- --------- ----- --------- --------- -- - --- - ----- ---- - ------------------ ------ - -------- ----- ---- -- - ----- ------- - ----- --- --------------------- ----- ------- - -- - ------- - ----- - ----- --------- --------- --------- ----------- - ----- - ----- --------- --------- -------- ------- --------------------- ------ ----------- - ----- - ----- -------- -- ---- - ----- -------- -- -- -- -- -- --------- - ---- - ----- --------- ----------- - -------- - ----- --------- -- ----- - ----- -------------------- -- -- -- -- -- - -- ---------------- -- -- - ------------------- -- ------ ---
在此示例中,我们创建了一个 /users 端点,该端点需要一个用户对象,该对象应该包含字符串名称和数字年龄。为此,我们使用了一个类型谓词函数 isUser 来验证用户对象。在 Fastify 辅助中,我们可以定义请求和响应的类型来验证输入。
通过使用 Fastify 的 validate 工具(例如,validateRequest、validateReply),我们可以确保请求和响应的类型与定义的类型相对应。例如,在我们的用户对象验证中,我们添加了 additionalProperties: false,这意味着我们只接受 name 和 age 字段。
结论
当我们使用 Fastify 和 TypeScript 时,我们可以使用 TypeScript 内置的数据验证工具来验证输入和响应的数据。这样,我们在代码类型和验证方面都可以得到很大的帮助,减少了使用 Joi 的需要。同时,我们可以使用 Fastify 的一些内置验证工具来进行必要的验证。我们希望本篇文章对你有所帮助。
示例代码可以在以下链接中获得:
https://github.com/Haocen2004/fastify-typescript-joi
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67079ccfd91dce0dc86ac2f6