由于其轻巧的设计,Fastify
已获得了很多知名度。但是,其插件生态系统很多关注。 Fastify采用了所有内容都是插件的想法,而使用JavaScript,一切都是对象。这使您可以快速将项目的功能作为插件封装并进行分发,以便其他项目可以使用您的代码。>让我们从本教程开始。您将学习fastify的以下方面:
如何设置第一个快速api
如何定义快速API路由
>发送请求的工具,例如卷发或邮递员
步骤1:基本API设置
<span>npm init -y </span>
首先,让我们创建基本的API设置。为了开始,我们需要在我们的项目root中创建一个名为index.js的新文件:
<span>npm i fastify --save </span>
<span>npm init -y </span>
>这里发生了几件事。我们首先加载快速应用程序对象并启用记录。接下来,我们声明了一条以JSON响应回复的根路线。代码段的最后一部分表明,我们正在端口3000上聆听该应用程序以接收请求。
>让我们验证您的基本服务器设置是否有效。首先,我们需要通过运行index.js文件来启动服务器:
><span>npm i fastify --save </span>
<span>touch index.js </span>
步骤2:定义CRUD路线
>步骤2.1:创建博客控制器
此文件包含一些演示数据,以避免使用数据库集成使本教程复杂化。因此,我们使用一个包含每个包含ID和标题字段的博客对象的数组。
此外,我们为该文件中的所有路由定义了不同的处理程序。处理程序始终接受req(请求)并回复参数。请求参数对于访问请求参数或请求正文数据很有用。>
>将以下代码添加到您的 /controller /blogs.js文件:>请注意,我们如何访问/api/blogs/:ID的路由的请求参数:via req.params.id。对于发布和放置路线,我们可以通过req.body访问请求的正文。
在步骤2.2中,我们将将路由处理程序连接到路由对象。
<span>// Require the framework and instantiate it </span><span>const app = require('fastify')({ </span> <span>logger: true </span><span>}) </span> <span>// Declare a route </span>app<span>.get('/', function (req<span>, reply</span>) { </span> reply<span>.send({ hello: 'world' }) </span><span>}) </span> <span>// Run the server! </span>app<span>.listen(3000, (err<span>, address</span>) => { </span> <span>if (err) { </span> app<span>.log.error(err) </span> process<span>.exit(1) </span> <span>} </span> app<span>.log.info(<span>`server listening on <span>${address}</span>`</span>) </span><span>}) </span>
再次,要保持代码清洁,让我们在项目根中定义一个路由文件夹。在这里,我们创建一个名为blogs.js的文件。该文件保留我们博客路由的路由对象:
幸运的是,Fastify允许我们定义一个包含路由对象的数组。在这里,我们可以将以前定义的处理程序搭配到不同的路线。不要忘记需要博客控制器。让我们看看:
>
>步骤2.3:注册快速路由<span>node index.js </span>
>
<span>npm init -y </span>
完成?是时候验证博客路线是否有效了。使用节点索引旋转服务器,然后访问http:// localhost:3000/blogs/1,从演示数据中获取第一个博客。您应该看到以下结果:
<span>npm i fastify --save </span>
都很好吗?让我们在第3步中了解如何将架构验证添加到请求和响应中。
>>此步骤会教您如何在项目中添加模式验证。我们可以在路线定义中使用架构密钥,以将验证模式传递到特定路线。
>让我们从定义路由/api/blogs/:id的架构开始,以验证请求参数和响应。要求?
要将验证对象连接到我们的路由,我们必须定义架构键。在路线数组中查找/api/blogs/:ID路线,并相应地更改对象:
<span>touch index.js </span>
<span>// Require the framework and instantiate it </span><span>const app = require('fastify')({ </span> <span>logger: true </span><span>}) </span> <span>// Declare a route </span>app<span>.get('/', function (req<span>, reply</span>) { </span> reply<span>.send({ hello: 'world' }) </span><span>}) </span> <span>// Run the server! </span>app<span>.listen(3000, (err<span>, address</span>) => { </span> <span>if (err) { </span> app<span>.log.error(err) </span> process<span>.exit(1) </span> <span>} </span> app<span>.log.info(<span>`server listening on <span>${address}</span>`</span>) </span><span>}) </span>
要验证我们的验证,让我们用ID 3检索博客。在http:// localhost:3000/api/blogs/3上打开浏览器。您应该看到以下响应:
<span>node index.js </span>
现在,让我们犯一个错误,然后更改ID字段的参数验证从sting到objoct:
<span>{ </span> <span>"hello": "world" </span><span>} </span>
从API请求相同的资源时,您将收到以下错误消息。
<span>// Demo data </span><span>let blogs = [ </span> <span>{ </span> <span>id: 1, </span> <span>title: 'This is an experiment' </span> <span>}, </span> <span>{ </span> <span>id: 2, </span> <span>title: 'Fastify is pretty cool' </span> <span>}, </span> <span>{ </span> <span>id: 3, </span> <span>title: 'Just another blog, yea!' </span> <span>} </span><span>] </span> <span>// Handlers </span><span>const getAllBlogs = async (req<span>, reply</span>) => { </span> <span>return blogs </span><span>} </span> <span>const getBlog = async (req<span>, reply</span>) => { </span> <span>const id = Number(req.params.id) // blog ID </span> <span>const blog = blogs.find(blog => blog.id === id) </span> <span>return blog </span><span>} </span> <span>const addBlog = async (req<span>, reply</span>) => { </span> <span>const id = blogs.length + 1 // generate new ID </span> <span>const newBlog = { </span> id<span>, </span> <span>title: req.body.title </span> <span>} </span> blogs<span>.push(newBlog) </span> <span>return newBlog </span><span>} </span> <span>const updateBlog = async (req<span>, reply</span>) => { </span> <span>const id = Number(req.params.id) </span> blogs <span>= blogs.map(blog => { </span> <span>if (blog.id === id) { </span> <span>return { </span> id<span>, </span> <span>title: req.body.title </span> <span>} </span> <span>} </span> <span>}) </span> <span>return { </span> id<span>, </span> <span>title: req.body.title </span> <span>} </span><span>} </span> <span>const deleteBlog = async (req<span>, reply</span>) => { </span> <span>const id = Number(req.params.id) </span> blogs <span>= blogs.filter(blog => blog.id !== id) </span> <span>return { msg: <span>`Blog with ID <span>${id}</span> is deleted`</span> } </span><span>} </span> module<span>.exports = { </span> getAllBlogs<span>, </span> getBlog<span>, </span> addBlog<span>, </span> updateBlog<span>, </span> deleteBlog <span>} </span>
您看到错误了吗?好的!让我们将更改恢复为字符串,以避免将来的错误并转到下一步。
<span>mkdir routes </span><span>cd routes </span><span>touch blogs.js </span>
>在这里,让我们利用Fastify富插件生态系统。您可以找到可以帮助您完成各种任务的插件,例如数据库集成或授权设置。为什么您可以花时间从头开始写授权,同时可以使用Fastify插件?通常,您想在Fastify生态系统之外寻找包裹,以帮助您解决某些问题或任务。但是,通过提供丰富的插件生态系统,Fastify成为一个一站式解决方案,绝对可以改善开发人员体验!
<span>const blogController = require('../controller/blogs'); </span> <span>const routes = [{ </span> <span>method: 'GET', </span> <span>url: '/api/blogs', </span> <span>handler: blogController.getAllBlogs </span> <span>}, </span> <span>{ </span> <span>method: 'GET', </span> <span>url: '/api/blogs/:id', </span> <span>handler: blogController.getBlog </span> <span>}, </span> <span>{ </span> <span>method: 'POST', </span> <span>url: '/api/blogs', </span> <span>handler: blogController.addBlog </span> <span>}, </span> <span>{ </span> <span>method: 'PUT', </span> <span>url: '/api/blogs/:id', </span> <span>handler: blogController.updateBlog </span> <span>}, </span> <span>{ </span> <span>method: 'DELETE', </span> <span>url: '/api/blogs/:id', </span> <span>handler: blogController.deleteBlog </span> <span>} </span><span>] </span>module<span>.exports = routes </span>
>关于插件的快速说明:您可以创建自己的插件来封装功能。此外,您可以将这些插件加载到快速应用程序对象。默认情况下,Fastify将首先从Fastify生态系统加载插件。之后,加载自定义插件。
好,让我们实用!我想使用Fastify-env插件,该插件可帮助您加载环境变量并为每个变量设置默认值。因此,让我们将此依赖性添加到我们的项目中:
<span>npm init -y </span>
<span>npm i fastify --save </span>
默认情况下,Fastify-env插件将通过so:app.config.port之类的fastify应用对象提供所有环境变量。为什么? Fastify-env插件将加载的配置附加到Confkey,默认情况下将其设置为配置。但是,如果您愿意,可以将其更改为另一个键。
>>使用节点index.js启动项目并监视输出。您应该看到端口变量在终端中打印。
其他有趣的插件?
>fastify-auth:在fastify
在文档中可以找到有关OnRoute Hook的特定细节。
>>让我们使用节点索引。JS启动API,以查看已注册的路由。您的终端输出应该看起来像这样:
<span>touch index.js </span>
获得相同的输出?成功!同时,这是Fastify教程的结尾。让我们以简短的结论来结束这个项目。
总结
Fastify是一个很棒的轻巧项目,可让您使用其富插件生态系统。您可以使用现有插件,而不是从头开始创建功能。换句话说,Fastify是开发人员的一站式商店,肯定会改善开发人员的体验。
>就个人而言,我喜欢快速挂钩功能,因为您可以在应用程序中收听各种生命周期事件。<span>// Require the framework and instantiate it </span><span>const app = require('fastify')({ </span> <span>logger: true </span><span>}) </span> <span>// Declare a route </span>app<span>.get('/', function (req<span>, reply</span>) { </span> reply<span>.send({ hello: 'world' }) </span><span>}) </span> <span>// Run the server! </span>app<span>.listen(3000, (err<span>, address</span>) => { </span> <span>if (err) { </span> app<span>.log.error(err) </span> process<span>.exit(1) </span> <span>} </span> app<span>.log.info(<span>`server listening on <span>${address}</span>`</span>) </span><span>}) </span>
要了解有关Fastify的更多信息,请查看以下文档页面:
>
常见问题(常见问题解答)关于使用Fastify const fastify = require('fastify')({logger:true})
fastify.listen(3000,(err,errive,address)=> {如果(err)投掷err
fastify.log.info(`'服务器在$ {address}`)
})
>
>
>中如何在fastify中定义路由? >在Fastify中,您使用路由方法定义路由。该方法将对象作为参数,该参数定义了路由的属性。这是一个示例:
url:'/',
> handler:function(request,reply,reply) 。您可以使用回复对象的代码并发送方法发送错误响应。这是一个示例:
fastify.get('/error',function(request,reploy){
reploy.code(500).send(new error(new Irror('内部服务器错误')))
})
>如何在Fastify中使用插件?
> origin:true
})
>
fastify提供了一个内置验证和序列化库,称为fastify-schema。您可以使用此库来验证传入请求并序列化响应。这是一个示例:
fastify.route({
>方法:'post',
> url:'/validate',
schema:{
body:{
类型:'object',
必需:['name','email'],
属性:{
name:{type:'string'},
电子邮件:{type:type:'string string '}
}
}
},
}
} )
fastify.Inject({
>方法:'get',
> url:'/',
},(err,response)=> {
>如何部署我的fastify应用程序?
以上是如何使用快速创建第一个REST API的详细内容。更多信息请关注PHP中文网其他相关文章!