在前端开发中,数据的传输和验证都是必不可少的环节。而 Fastify 是一个 Node.js 的 web 框架,它提供了快速、低开销的功能,广为人知。其中它使用优秀的 JSON Schema 验证请求的方式,使请求体的传输更加安全。在本文中我们将介绍如何使用 Fastify 中提供的 JSON Schema 验证请求体的功能,并给出实际示例代码。
什么是 JSON Schema
JSON Schema 是一个可以用于验证 JSON 数据的描述语言。利用 JSON Schema 可以明确 JSON 数据的内容、结构和类型等信息,并能够对 JSON 数据进行有效的验证。JSON Schema 使用起来非常简便,就像是一个类似于 XML Schema 的描述文件一样。
Fastify 中的 JSON Schema
Fastify 框架内部已经实现了 JSON Schema 风格的输入验证功能。我们可以在请求处理函数中定义请求正确的 json 对象,并在路由层中使用相关功能进行验证。基本的使用方式如下:
// www.javascriptcn.com code example
const fastify = require('fastify')()
fastify.post('/', {
schema: {
body: {
type: 'object',
required: ['name', 'age'],
properties: {
name: { type: 'string' },
age: { type: 'number' }
}
}
}
}, (req, reply) => {
const { name, age } = req.body
reply.send({ name, age })
})
fastify.listen(3000)在上面的代码中,我们将路由请求参数 schema,作为 post 方法的第二个参数传入。在其中使用了 Fastify 提供的 JSON Schema 验证功能,验证了请求体是否满足规定的要求。如果请求体中包含了所有的必填项,并且类型满足要求,那么该请求就可以被处理。需要注意的是,对于非必填项验证,类型不满足要求等情况,Fastify 将会返回相应的错误信息。
学习与指导
这里我们将对上述代码进行一个详细且深度的讲解,加深读者的理解。在上述代码中,我们传递一个包含 schema 属性的对象作为 post 方法的第二个参数,该属性定义了请求体的相关验证规则。具体解释如下:
首先,该对象包含一个 body 属性,该属性定义了请求的 JSON 对象类型,并可以设定相应的验证规则。如上述示例中,我们设置了必须存在两个参数 name 和 age,其类型分别是 string 和 number。在没有满足这个条件的情况下,Fastify 会向客户端返回一个 HTTP 错误,一般的返回值为 422(Unprocessable Entity)。需要提醒的是,在定义一个 JSON Schema 的时候,必须严格的跟从 JSON Schema 的语法规范,否则将无法通过验证。JSON Schema 能够验证的类型包括:string, number, integer, boolean, null 等。
其次,我们在 this.post() 方法中调用一个 request 处理器方法,该方法用于接收在请求体中被包含的 json 数据,并在该函数中,利用已经定义的 body 参数方法,将请求体对象进行验证。
最后,请求处理器函数中的参数 req 和 reply 分别代表了请求对象和响应对象,从中可以获取到请求体信息。在示例中,我们使用了解构对象的方式,将请求体中的 name 和 age 变量提取出来,并将其包装成一个包含 name 和 age 的对象,用 reply.send() 方法作为响应返回给客户端。
示例代码
上文中我们已经对使用 Fastify 的 JSON Schema 进行验证的方式和重要性进行了讲述。接下来将会给出基于 Fastify 的 web 服务器的一个简单的例子,来体验 JSON Schema 进行验证的实际效果:
// www.javascriptcn.com code example
const fastify = require('fastify')()
fastify.post('/', {
schema: {
body: {
type: 'object',
required: ['name', 'age'],
properties: {
name: { type: 'string' },
age: { type: 'number' }
}
}
}
}, (req, reply) => {
const { name, age } = req.body
reply.send({ name, age })
})
fastify.listen(3000, err => {
if (err) throw err
console.log('Server listening at http://localhost:3000')
})
将上述代码保存后,我们可以在命令行内使用 node server.js 的方式运行。在服务器正常启动之后,在浏览器输入 http://localhost:3000/. 这时,你会看到浏览器返回了一段错误的 JSON 格式的数据,因为请求体中未包含定义过的对象。接下来,你可以在如下的 curl 命令下,用 curl 提交包含全部必填项的 json 对象请求:
$ curl -X POST -H "Content-Type:application/json" -d '{"name":"example", "age": 18}' http://localhost:3000/你将看到服务器在成功验证该请求体后,将客户端返回一个包含 name 和 age 的 json 响应消息。除此之外,Fastify 也提供了更为复杂的语法等待你去发掘。
结束语
Fastify 在为我们提供快速高效的请求处理能力的同时,也提供了验证请求输入的完整解决方案。通过本篇文章,希望读者在使用 Fastify 进行前端开发时,能够熟练使用 Fastify 的 JSON Schema 验证功能,并将其融入到开发中去。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67d0125be46428fe9ec9ebf2