首页 web前端 js教程 羽毛的初学者指南。

羽毛的初学者指南。

Feb 14, 2025 am 09:55 AM

Feathers.js:快速构建RESTful API服务器的指南

A Beginner’s Guide to Feathers.js

核心要点:

  • Feathers.js 简化了RESTful API服务器的创建,处理大部分重复的后端工作,让开发者专注于代码定制和配置。
  • 该框架基于Express构建,支持SQL和NoSQL数据库,使用自动生成必要代码的服务,可以轻松进行CRUD操作。
  • Feathers.js中的身份验证可以使用JSON Web Tokens (JWT)来保护API端点,确保只有授权用户才能访问或修改数据。
  • Feathers.js中的钩子(Hooks)充当中间件函数,可以在数据到达数据库之前或之后操作数据,这对于验证、授权和动态添加字段等任务非常有用。
  • Feathers.js 旨在易于使用和扩展,通过WebSockets支持实时更新,并提供适用于各种前端框架的灵活架构。

本文将指导您使用Feathers.js在Node.js中构建RESTful API服务器。

API服务器,也称为应用程序服务器,是一个向前端应用程序提供数据的程序。它还在后端处理业务逻辑,并提供对组织数据库的受限访问。它不仅可以防止未经授权的人员访问数据;如果登录用户没有权限,它还可以限制他们访问或更改数据。

您构建的每个应用程序都需要向最终用户提供服务。为此,您的应用程序需要处理数据。您可以使用远程API来创建新服务。但是,对于大多数应用程序,您需要管理自己的数据存储。一个流行的选择是使用在线数据存储服务,例如Firebase。这样,您不必处理运行分布式数据库服务器的繁琐细节。但是,您的项目需求可能需要使用功能齐全的内部数据库管理系统,例如MongoDB或Oracle。为了让您的前端应用程序访问数据库中存储的数据,您需要一个位于数据库和前端应用程序之间的服务器应用程序。

A Beginner’s Guide to Feathers.js

如上图所示,应用程序服务器的工作是从数据库中使用SQL或NoSQL命令访问数据,并将其转换为前端应用程序(客户端浏览器)可以理解的格式——例如JSON。此外,应用程序服务器可以使用各种安全协议——例如HTTPS加密和令牌授权——来确保数据库和客户端应用程序之间的通信安全可靠。使用这种架构的一个主要优点是,您可以使用相同的应用程序服务器部署针对不同平台的应用程序——桌面、移动、Web等等。而且,为了高效地为更多用户提供服务并实现快速的响应时间,也很容易水平扩展您的应用程序。

我们将构建一个简单的API服务器,并演示Feathers提供的各种功能。

先决条件:

在开始学习本教程之前,您需要对以下主题有扎实的基础:

  • ES6 JavaScript
  • 创建Express应用程序
  • 使用Express创建RESTful API

Feathers构建在Express之上,Express是Node.js的一个极简主义Web框架。如果您完成了链接中演示的教程,您会发现仅仅使用Express构建RESTful API非常费力。使用Feathers,大部分重复性工作已经为您完成。您只需要专注于配置和定制代码。让我们深入代码,学习这个Web框架是如何工作的。

项目创建:

要开始使用Feathers,您需要全局安装其命令行应用程序:

npm install -g @feathersjs/cli
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

接下来,使用以下命令创建一个新的API项目:

mkdir contacts-api
cd contacts-api
feathers generate app
登录后复制
登录后复制
登录后复制
登录后复制

以下是我的选择,您可以随意选择任何测试框架。不幸的是,测试不在本文的重点范围内,因此这里不会介绍。我个人喜欢简单,这就是我选择Jest的原因。

A Beginner’s Guide to Feathers.js

安装完成后,您可以打开您喜欢的代码编辑器查看项目文件。

A Beginner’s Guide to Feathers.js

如果您完成了我在先决条件部分列出的Express教程,那么生成的代码不应该让您感到害怕。这是一个简短的摘要,描述了文件夹和文件。

A Beginner’s Guide to Feathers.js

现在不必太担心每个文件的作用。在本教程的过程中,您会逐渐了解它们的工作方式。现在,让我们确认测试是否正常工作。

代码风格检查(Linting):

为了确保我们的项目符合定义的ESLint规则,只需运行命令npm test。如果您使用的是Unix或Linux平台,这应该可以正常运行。如果您使用的是Windows,则需要调整一些内容才能成功运行测试。

首先,转到package.json并查看scripts部分。将test行更改为:

"scripts": {
  "test": "npm run eslint && SET NODE_ENV= npm run jest",
},
登录后复制
登录后复制
登录后复制
登录后复制

接下来,如果您在Visual Studio Code中安装了Prettier,则需要在“工作区设置”选项卡中将单引号设置更改为true:

{
  "prettier.singleQuote": true
}
登录后复制
登录后复制

最后,确保在创建或编辑任何文件时,换行符为LF。如果您使用的是Visual Studio Code或类似的编辑器,您可以在状态栏中检查当前的换行符样式。如果显示CRLF,则更改为LF。进行这些更改将帮助您通过代码风格检查测试。不幸的是,要使测试通过需要更多工作,这里将不作介绍。

让我们看看如何生成CRUD RESTful接口。

生成服务:

在Express中构建RESTful CRUD API接口需要一些工作。在Feathers中,您只需执行单个命令,回答几个问题,即可生成代码:

npm install -g @feathersjs/cli
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

在本教程中,我们将使用NeDB数据库。Feathers确实支持SQL数据库(如MySQL)和NoSQL数据库(如MongoDB)。但是,安装数据库系统——无论是在您的机器上还是在云服务器上——都需要花费一定的时间来配置它。另一方面,NeDB是一个完全用JavaScript编写的内存数据库,支持MongoDB API的一个子集。无需配置;您只需安装它即可。它非常适合原型设计和测试新应用程序。这就是我们将在本教程中使用的数据库。

让我们简要地看一下使用此命令生成的一些文件:

  • services/contacts/contact.service.js。这是一个Feathers服务,它为/contacts提供CRUD API端点。非常小,不是吗?这是因为Feathers为我们完成了繁重的工作。它使我们免于编写样板CRUD代码。
  • services/contacts/contact.hooks.js。在这里,我们自定义CRUD逻辑的行为。我们有before部分,我们可以在Feathers读取或写入数据库之前检查或更改数据。我们还有一个after部分,我们可以在将结果发送到客户端应用程序之前检查或更改数据库中的结果。我们可以执行诸如限制访问、数据验证、执行联接操作以及计算附加字段或列的值等操作。
  • models/contacts.model.js。在这里,我们定义一个模型并将其附加到数据库表。这也是我们定义模式的地方,该模式可用于在插入或更新新记录时验证字段。不幸的是,NeDB不支持模式。但是,我已经提供了一个连接到MongoDB的模型示例,该模型通过mongoose适配器支持模式功能:
mkdir contacts-api
cd contacts-api
feathers generate app
登录后复制
登录后复制
登录后复制
登录后复制

尽管使用NeDB有一些限制,但它仍然是一个非常适合原型设计的数据库。大多数NoSQL数据库允许您使用任何结构提交数据,而无需首先定义模式。最好在实现项目需求后实现模式。有了模式,Feathers将使用您定义的规则为您执行字段验证。您需要一个可用于生产的数据库(如MongoDB)才能定义模式。请注意,开发数据库的配置定义在config/default.json中:

"scripts": {
  "test": "npm run eslint && SET NODE_ENV= npm run jest",
},
登录后复制
登录后复制
登录后复制
登录后复制

这是提供数据库凭据的地方。我们还有另一个配置文件config/production.json。这是在部署Feathers应用程序时使用的生产数据库配置。在开发过程中使用单独的数据库非常重要。否则,您有删除或损坏生产数据库中业务运营数据的风险。

现在我们已经设置了联系人的CRUD服务,是时候试一试了。您可以使用命令npm start启动Feather服务器。请注意,此服务器不支持热重载。因此,每次更改代码时都需要重新启动它。为了与我们的Feathers应用程序交互,我们需要一个API浏览器工具,例如Postman或Insomnia。在本教程中,我将使用Insomnia,但是您可以轻松地使用Postman或任何其他工具来进行操作。

创建新的GET请求(按Ctrl N),并将其命名为“列出联系人”。在URL部分,输入http://localhost:3030/contacts。当您点击“发送”按钮时,您应该看到以下视图:

A Beginner’s Guide to Feathers.js

什么也没有!我们的数据库当前为空,因此我们需要创建一些新的联系人。创建一个名为“创建联系人”的新请求。填写其余字段,如下所示:

A Beginner’s Guide to Feathers.js

如果您忘记将上述表单中的方法更改为POST,您可以稍后进行更改。将方法更改为POST,并将“正文”选项卡更改为JSON。将以下数据复制到JSON选项卡中:

npm install -g @feathersjs/cli
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

当您点击“发送”按钮时,您应该会收到以下响应。请注意,已为您的新联系人生成了一个_id

A Beginner’s Guide to Feathers.js

返回“列出联系人”,然后再次点击“发送”按钮。您应该得到以下结果:

mkdir contacts-api
cd contacts-api
feathers generate app
登录后复制
登录后复制
登录后复制
登录后复制

返回“创建联系人”,并发布几个新记录:

"scripts": {
  "test": "npm run eslint && SET NODE_ENV= npm run jest",
},
登录后复制
登录后复制
登录后复制
登录后复制
{
  "prettier.singleQuote": true
}
登录后复制
登录后复制

现在让我们执行更新操作。为此,我们不会使用UPDATE HTTP方法。此方法将完全覆盖记录。我们想要做的只是覆盖单个字段,而不是整个记录。为此,我们将使用PATCH。创建一个新的请求,“更新联系人”,如下所示:

A Beginner’s Guide to Feathers.js

在URL字段中,输入http://localhost:3030/contacts/{_id}。用第一条记录的ID替换{_id}。将以下数据粘贴到JSON选项卡中:

feathers generate service
登录后复制

点击“发送”按钮。您应该会看到以下结果:

A Beginner’s Guide to Feathers.js

请注意其余字段保持不变。接下来,我们将删除一条记录。这很容易。只需创建一个新的DELETE请求,并将其命名为“删除联系人”。在URL字段中,使用格式http://localhost:3030/contacts/{_id}。就像之前一样,用要删除的记录的ID替换{_id}。点击“发送”将为您删除该记录。您可以通过再次运行“列出联系人”请求来确认。

我们刚刚验证了所有CRUD操作都运行正常。在下一节中,我们将学习如何设置身份验证。

(以下内容与原文类似,但进行了部分语句调整和段落合并,以提高可读性和流畅性,并保持原意不变。图片格式保持不变。)

身份验证:

目前,我们的/contacts API端点不受保护。如果我们将应用程序部署到云服务器,任何拥有URL的人都可以访问和操作我们的记录。为了限制访问,我们需要设置身份验证。我们将使用JSON Web Tokens来为我们的API应用程序实现身份验证。运行以下命令来设置它:

npm install -g @feathersjs/cli
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

如您所见,Feathers支持不同的用户身份验证方式。“本地用户名 密码”选项最容易设置。

选择以下选项:

接下来,我们需要创建一个新用户。我们可以使用Insomnia或任何其他API浏览器工具来完成此操作。创建一个新的请求,并将其命名为“创建用户”。

在JSON选项卡中,发送以下数据:

mkdir contacts-api
cd contacts-api
feathers generate app
登录后复制
登录后复制
登录后复制
登录后复制

您应该会收到类似以下的响应:

我们现在有了一个用户。让我们通过创建一个新的请求“列出用户”并发送URL http://localhost:3030/users来确认这一点。不幸的是,您将收到以下响应:

我们需要进行身份验证才能访问此数据。由于我们没有开发可以用来登录的前端应用程序,我们将继续使用API浏览器。创建一个新的请求,并将其命名为“获取JWT令牌”。填写表单,如下所示:

此请求使用POST方法。为了更清晰起见,您可以将其重命名为“登录”。在JSON选项卡中,复制以下数据:

"scripts": {
  "test": "npm run eslint && SET NODE_ENV= npm run jest",
},
登录后复制
登录后复制
登录后复制
登录后复制

点击发送按钮后,您应该会收到以下响应:

复制令牌代码(不带双引号)。转到“列出用户”请求页面,选择“Auth”选项卡并选择Bearer。将此令牌代码粘贴到TOKEN字段中。

点击“发送”按钮后,您应该会看到用户列表。请注意,我们的身份验证系统并不完全安全。任何拥有/users URL端点的人都可以创建一个新帐户并访问我们的系统。为了防止未经授权创建新帐户,我们也需要限制该端点。打开文件services/users/users.hooks.js并更新以下代码段:

这将确保只有经过身份验证的用户才能创建新帐户。下一步是保护/contacts端点。只需打开文件services/contacts/contacts.hooks.js并相应地进行更新:

重新启动Feathers服务器以使代码更改生效。如果您尝试运行“列出联系人”请求,您将收到以下响应:

要进行身份验证,您需要像之前一样设置Bearer令牌。完成此操作后,您可以发送请求,并且应该会收到您的联系人列表。请注意,您之前获得的令牌将在一天后过期。为提高效率,最好使用环境变量,以便更容易一次更新所有API请求参数。在构建前端应用程序时,您需要将此令牌存储在本地存储中。不要使用cookie。否则,您的应用程序将容易受到CSRF攻击。查看Feathers安全文档,了解您应该注意的其他安全风险。

现在您已经设置了身份验证,之后创建的任何新服务都将为您提供保护新端点的选项。让我们在下一节中查看本教程的最后一个主题。

钩子(Hooks):

钩子是附加到服务方法之前、之后或出错时的中间件函数。它们通常用于处理日志记录、限制访问、保护字段、填充相关实体、发送通知等。如果您查看services/users/users.hooks.js,您可以看到一些内置的Feathers钩子正在使用中。我们将创建我们自己的自定义钩子。首先,停止服务器并删除data/contacts.db数据库表。接下来,使用以下命令生成一个新钩子:

npm install -g @feathersjs/cli
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

使用以下选项创建自定义钩子process-contact

我们想在这个钩子中做的是在处理“创建联系人”请求之前注入两个新字段。

  • createdBy:通过_id链接到当前登录的用户
  • createdOn:添加创建日期

打开文件hooks/process-contact.js并按如下方式更新文件:

接下来,创建一个另一个钩子populate-user,它将在请求时将用户对象附加到每个联系人记录。按照以下屏幕截图中的说明进行操作:

打开文件hooks/populate-user并插入以下代码:

现在您可以启动服务器了。使用“创建联系人”请求再次创建三个联系人。如果您还没有设置Bearer令牌,请设置它。否则,您将收到授权错误。这是创建新联系人时应该得到的响应类型:

总结:

我希望您现在已经学习了如何快速构建自己的RESTful API服务器。我们只触及了基础知识,您应该阅读完整的指南以发现Feathers可以提供的更多功能,这些功能可以帮助您以最小的努力实现高级功能。您还应该查看Awesome Feathers页面,其中包含大量的资源。无论您需要插件、项目示例还是教程,您都可能会在那里找到链接。您还应该查看Feathers-plus CLI,它是增强版的Feathers。它在Feathers CLI已提供的功能之上添加了新功能,例如生成用于播种和GraphQL支持的代码。

如果您想进一步改进contacts-api项目,我建议您使用您选择的框架创建一个新的前端应用程序。为/contacts/users端点构建登录屏幕和CRUD页面。享受实施挑战的乐趣。

关于Feathers.js的常见问题:

  • 什么是Feathers.js? Feathers.js是一个用于构建实时应用程序的Web框架。它旨在轻量级、灵活且易于使用,提供了一套用于构建可扩展和可维护服务器端应用程序的工具和模式。

  • Feathers.js支持哪些编程语言? Feathers.js主要在服务器端和客户端使用JavaScript。它可以在服务器上与Node.js一起使用,并支持客户端上的各种JavaScript框架,包括React、Angular和Vue.js等框架。

  • Feathers.js的关键特性是什么? Feathers.js包括实时功能(通过WebSocket和RESTful API)、面向服务的架构、对各种数据库(MongoDB、PostgreSQL等)的支持、身份验证和授权机制以及用于扩展的插件系统等特性。

  • Feathers.js如何处理实时通信? Feathers.js利用WebSockets的功能来实现实时通信。它开箱即用地提供了一个实时API,允许客户端在服务器上的数据发生更改时接收实时更新。

  • 我可以将Feathers.js用于服务器端渲染(SSR)吗? 虽然Feathers.js主要用于构建API和实时应用程序,但它可以与Next.js或Nuxt.js等其他框架结合使用,以实现Web应用程序的服务器端渲染(SSR)。

所有图片链接都保留了原文的格式。

以上是羽毛的初学者指南。的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
威尔R.E.P.O.有交叉游戏吗?
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

如何创建和发布自己的JavaScript库? 如何创建和发布自己的JavaScript库? Mar 18, 2025 pm 03:12 PM

文章讨论了创建,发布和维护JavaScript库,专注于计划,开发,测试,文档和促销策略。

如何在浏览器中优化JavaScript代码以进行性能? 如何在浏览器中优化JavaScript代码以进行性能? Mar 18, 2025 pm 03:14 PM

本文讨论了在浏览器中优化JavaScript性能的策略,重点是减少执行时间并最大程度地减少对页面负载速度的影响。

前端热敏纸小票打印遇到乱码问题怎么办? 前端热敏纸小票打印遇到乱码问题怎么办? Apr 04, 2025 pm 02:42 PM

前端热敏纸小票打印的常见问题与解决方案在前端开发中,小票打印是一个常见的需求。然而,很多开发者在实...

如何使用浏览器开发人员工具有效调试JavaScript代码? 如何使用浏览器开发人员工具有效调试JavaScript代码? Mar 18, 2025 pm 03:16 PM

本文讨论了使用浏览器开发人员工具的有效JavaScript调试,专注于设置断点,使用控制台和分析性能。

谁得到更多的Python或JavaScript? 谁得到更多的Python或JavaScript? Apr 04, 2025 am 12:09 AM

Python和JavaScript开发者的薪资没有绝对的高低,具体取决于技能和行业需求。1.Python在数据科学和机器学习领域可能薪资更高。2.JavaScript在前端和全栈开发中需求大,薪资也可观。3.影响因素包括经验、地理位置、公司规模和特定技能。

如何使用源地图调试缩小JavaScript代码? 如何使用源地图调试缩小JavaScript代码? Mar 18, 2025 pm 03:17 PM

本文说明了如何使用源地图通过将其映射回原始代码来调试JAVASCRIPT。它讨论了启用源地图,设置断点以及使用Chrome DevTools和WebPack之类的工具。

如何使用JavaScript将具有相同ID的数组元素合并到一个对象中? 如何使用JavaScript将具有相同ID的数组元素合并到一个对象中? Apr 04, 2025 pm 05:09 PM

如何在JavaScript中将具有相同ID的数组元素合并到一个对象中?在处理数据时,我们常常会遇到需要将具有相同ID�...

console.log输出结果差异:两次调用为何不同? console.log输出结果差异:两次调用为何不同? Apr 04, 2025 pm 05:12 PM

深入探讨console.log输出差异的根源本文将分析一段代码中console.log函数输出结果的差异,并解释其背后的原因。�...

See all articles