譯者 | 盧鑫旺
審校 | 孫淑娟
你是否正在尋找一種方法來構建具有身份驗證、數據庫設置和授權等特性的Web應用程序,而無需編寫大量的代碼和配置?你是否想在幾天內創建一個可用于生產的應用程序?信不信由你,這是可能的!本教程將向你展示如何使用Feathers.js在幾分鐘內創建一個REST API。我們將學習如何使用Feathers.js實現一個示例API,并分享一些想法和注意事項。
1.什么是Feathers.js?
Feathers.js是一個輕量級的Web框架,用于使用JavaScript或TypeScript開發實時應用和REST API。
Feathers.js可以與任何后端技術進行交互,支持十多個數據庫,還可以與任何前端技術一起工作,比如React、VueJS、Angular和React Native。
Feathers.js以其易用性、交付速度和豐富文檔而聞名。對于Feathers,你只需要運行一個簡單的命令就可以添加一個特性。
2.知識預備
本教程是一個實際操作的演示。首先,你要做如下準備:
- 安裝Node.js
- 安裝Arctype
- 安裝Insomnia
- 熟悉Node.js和Express.js
3.我們將要構建什么
你將創建一個電影租賃應用程序來演示Feathers.js和Arctype數據庫可視化工具的功能。管理員將在這個程序中生成電影,通過身份驗證的用戶將能夠租用它們。你將學習使用Sequelize關聯feather .js中的表,限制訪問特定的路由,并將數據庫鏈接到Arctype。
4.準備開始
首先,打開命令行界面,用下面的命令為本教程創建一個文件夾:
npm install @feathersjs/feathers --save
等待安裝完成,并使用下面的命令確認是否安裝成功:
feathers -V
如果安裝過程一切順利,你將在控制臺上看到打印出來的版本號。
5.創建一個應用
在安裝好Feather.js后,使用下面的命令為此應用程序創建一個文件夾:
Mkdir RestWithFeathers && RestWithFeathers
然后,使用下面的命令生成一個新的API應用程序:
feathers generate app
上面的命令將提示你為應用程序選擇配置。對于本教程中的演示,你的選擇應該如下面的截圖所示:
在上面的截圖中,我們做了如下的選擇:
- 首選編程語言為Javascript
- 指定應用程序的名稱(movie-rental)
- 選擇src作為項目樣板文件的位置
- 選擇npm作為包管理工具
- 啟用用戶身份驗證
- 選擇使用Eslint分析我們的代碼
- 選擇用戶名和密碼身份驗證策略
- 選擇user作為實體的名稱
- 選擇Sequelize作為應用的ORM
- 選擇SQLlite作為我們的數據庫
- 指定數據庫名稱為movieDB
一旦選擇完成,該命令將生成一個類似Express.js風格的項目結構。讓我們看看通過運行上述命令生成的文件夾結構。
在本教程中,我們將看到以下內容:
- config:包含應用程序的配置文件
- node_modules:用于存儲運行應用程序所需的已安裝軟件包列表的文件夾
- public:包含可以提供給客戶端的靜態文件
- src:包含Feathers.js應用程序的服務代碼
- src/hooks:包含應用程序的自定義鉤子
- src/middleware:包含Express.js中間件
- src/service:包含我們的應用程序服務
- src/index.js:啟動應用的入口文件
- src/app.js:配置Feathers.js應用程序
- src/app.hook.js:包含應用到每個服務的鉤子
- src/channels.js:設置Feathers.js事件通道
- test:包含應用程序的測試代碼
現在使用如下命令以開發模式啟動服務:
npm run dev
以開發模式運行服務會激活熱加載和控制臺錯誤日志。此時,服務運行在3030端口,同時一個moviedb.sqlite文件會創建在項目的根目錄中。
6.創建服務
服務是實現某些方法的對象或類的實例。服務為與任何數據交互提供一致的、獨立于協議的接口。在Feathers.js中,你只需要運行一條命令,就能為創建服務做好一切準備。使用如下命令來創建一個movie應用:
feathers generate service
上面的命令將提示你為你的服務選擇配置。你的選擇應該如下面的截圖所示:
這里,你為你的movie項目表選擇了ORM、服務名、路由URL,并在movie項目路由上啟用了身份驗證。一旦這些選擇完成,該命令將在src/service文件夾中生成下面的文件夾結構。
在你的movie.hook文件中,Feathers添加了下面的代碼片段,確保在請求通過這個路由傳遞到movie service之前,必須確認用戶登錄時發送的用戶訪問令牌。
before: {
all: []
find: [ authenticate('jwt') ]
get: [ authenticate('jwt') ],
create: [ hashPassword('password') ],
update: [ hashPassword('password'), authenticate('jwt') ],
patch: [ hashPassword('password'), authenticate('jwt') ],
remove: [ authenticate('jwt') ]
},
接著,使用如下命令創建一個租賃服務
feathers generate service
上面對movie service執行了相同的操作,但是這次生成了不同的文件夾名和文件,如下所示:
它也會在所有的路由中調用JWT authenticate('jwt')方法。此外,該命令將為你剛剛創建的服務生成相應的模型,并使用一些樣板文件,如下所示:
7.創建數據庫表
創建了服務和模型后,修改模型的屬性以獲得電影和租賃表所需的屬性。對于電影模型,將以下屬性添加到屬性中。
title: {
type: DataTypes.STRING,
allowNull: false,
},
producer: {
type: DataTypes.STRING,
allowNull: false,
},
imageURL: {
type: DataTypes.STRING,
allowNull: false,
},
createdAt: { type: DataTypes.DATE, defaultValue: Date.now },
updatedAt: { type: DataTypes.DATE, defaultValue: Date.now },
然后,在租賃模型中,添加如下屬性:
quantity: {
type: DataTypes.INTEGER,
allowNull: false,
},
createdAt: { type: DataTypes.DATE, defaultValue: Date.now },
updatedAt: { type: DataTypes.DATE, defaultValue: Date.now },
我們需要在用戶、電影、租賃模型中創建關聯,讓我們進入下一節。
8.數據關系
數據庫關系是使用連接語句檢索數據時在表之間形成的關聯。關系通常使用ER圖來規劃。我們的應用有一張用戶(user)表、電影(movie)表、租賃(rental)表。電影歸租賃公司所有,用戶擁有租賃公司。在每個數據庫中,維護此數據的最直接的方法是在它們之間建立關系,將表id保存為與它們相關的表中的外鍵。讓我們繼續創建三個表之間的關系。在models/user.models.js中,找到如下注釋的位置:
// Define associations here
// See https://sequelize.org/master/manual/assocs.html
并添加下面的代碼片段
const { rentals } = models;
users.hasMany(rentals);
在代碼片段中,你創建了一個用戶表與租賃表的一對多關系。這意味著一個用戶可以有多個租賃。
之后,我們可以添加如下代碼到models/movie.model.js文件中:
const { rentals, movie } = models;
movie.belongsToMany(rentals, { through: 'MovieRendtals' });
在上面的代碼片段中,我們在電影表與租賃表之間創建了一個多對多關系,這意味著一個電影可以有多個租賃。在多對多關系中,創建一個連接表來跟蹤兩個表的id,在本例中為MovieRentals。最后,添加如下代碼片段到models/rentals.model.js文件中:
const { users, movie } = models;
rentals.belongsTo(users);
rentals.belongsToMany(movie, { through: 'MovieRentals' });
現在,表之間互相有了關系。你可以在創建數據或從任何服務獲取數據時將數據加載到表中。這讓我們進入到了Feathers.js中的鉤子函數環節。
9.添加自定義鉤子
鉤子是插件化的中間件函數,可以注冊在服務方法前,服務方法后,或者方法報錯時。你可以注冊一個鉤子函數或者創建一個鉤子函數鏈來創建復雜的工作流。你可以創建一個鉤子來加載與每個表相關的數據。在你的service/rentals文件夾中,創建get-related.js文件并把如下代碼片段寫進文件中:
module.exports = function (options = {}) {
return async (context) => {
const sequelize = context.app.get('sequelizeClient');
const { users, movie } = sequelize.models;
context.params.sequelize = {
include: [{ model: users }, { model: movie }],
raw: false,
};
return context;
};
};
在上述代碼片段中,是告訴Feathers.js當一部電影被租賃時記載用戶和電影模型的數據。現在使用如下的代碼片段更新你的service/rentals/rental.hooks.js文件。修改before對象內部的代碼。
all: [authenticate('jwt')],
find: [getRelated()],
get: [getRelated()],
create: [getRelated()],
update: [],
patch: [],
remove: []
10.應用測試
現在讓我們用Insomnia測試應用程序。我們從用戶路由開始。
(1)創建用戶
在/user路由下創建用戶
(2)驗證用戶
在/authentication路由驗證用戶
(3)創建一部電影
在/movie路由創建電影
(4)租賃一部電影
在/rentals路由中租賃一部電影。你將會在此路由中指定userId,movieId和quantity字段。
現在繼續測試每個路由上的其他請求方法,如GET、UPDATE和DELETE。
11.連接Arctype
將數據庫連接到Arctype,以查看應用程序中創建的表和數據。你可以通過以下步驟連接到Arctype:
(1)運行Arctyp
(2)點擊SQLite選項卡
(3)點擊Choose SQLite File按鈕
(4)導航到項目文件夾并選擇moviedb.sqlite文件
(5)測試連接并保存配置
一旦數據庫成功連接Arctype,你將會看到如下截圖所示的users表,movies表,rentals表,MovieRentals表。
此時,你的數據庫就已經成功連接上了Arctype。你可以點擊每一張表去看存儲的數據。
12.結語
在本教程中,通過構建一個演示應用程序,你已經了解了Feathers.js。你已經學習了如何設置feather .js應用程序、創建服務、實現身份驗證/授權、創建自定義鉤子以及連接到Arctype。既然你已經掌握了這些知識,那么你打算如何在下一個項目中使用Feathers.js ?你甚至可以通過fork或克隆GitHub庫來為這個項目添加一些額外的特性。
原文鏈接:https://dzone.com/articles/building-a-rest-api-with-feathersjs-and-sqlite
譯者介紹
盧鑫旺,51CTO社區編輯,半路出家的九零后程序員。做過前端頁面,寫過業務接口,搞過爬蟲,研究過JS,有幸接觸Golang,參與微服務架構轉型。目前主寫Java,負責公司可定制化低代碼平臺的數據引擎層設計開發工作。