cd 節點-gRPC 服務

npm init -y

現在,您需要安裝構建 gRPC 服務所需的依賴項。這些依賴項包括:

使用以下代碼安裝這些依賴項:

npm 安裝 @gRPC/gRPC-js @gRPC/proto-loader

創建您將在此項目中主要處理的兩個文件,分別是product.protoserver.js

觸摸product.proto server.js

第 2 步:定義服務

接下來,您將在文件中編寫服務定義product.proto。如上所述,gRPC 使用 Protobuf 作為其接口定義語言。

首先,指定您將使用的 Protobuf 語法 – 并使用package關鍵字為您的服務聲明命名空間:

語法=“proto3”;

包裝產品;

接下來,聲明客戶端可以在您的服務中遠程調用的 RPC 方法。在本教程中,您將聲明五種不同的方法對產品執行不同的操作:createProduct、、、和readProductreadProducts這些方法可以使用以下代碼聲明:updateProductdeleteProduct

服務產品 {
rpc CreateProduct (ProductItem) 返回 (ProductItem);
rpc ReadProduct(ProductId) 返回(ProductItem);
rpc ReadProducts (VoidParam) 返回 (ProductItems);
rpc UpdateProduct(ProductItem) 返回(ProductItem);
rpc DeleteProduct(ProductId) 返回(DeleteProductResponse);
}

在此服務中,我們使用幾種消息類型作為這些方法的輸入和輸出參數:

這些消息可以用以下代碼來定義:

消息 VoidParam {}

消息產品編號 {
int32 ID=1;
}

枚舉類別 {
智能手機=1;
相機=2;
筆記本電腦=3;
耳機 = 4;
充電器=5;
揚聲器 = 6;
電視機=7;
調制解調器=8;
鍵盤 = 9;
麥克風=10;
}
消息產品項目 {
int32 ID=1;
字符串名稱 = 2;
字符串描述=3;
浮動價格=4;
類別category = 5;
}

消息產品項目 {
重復ProductItem產品=1;
}

消息 DeleteProductResponse {
bool 已刪除 = 1;
}

步驟 3:設置服務器

現在,您將使用 gRPC-js 和 proto-loader 包設置 gRPC 服務器。導航到server.js以下代碼并粘貼:

const gRPC = require('@gRPC/gRPC-js');
const protoLoader = require(“@gRPC/proto-loader”);

const packageDef = protoLoader.loadSync("product.proto", {});
const gRPCObject = gRPC.loadPackageDefinition(packageDef);

const productPackage = gRPCObject.產品;

const 產品 = [];

函數 createProduct(調用,回調) {}
函數 readProduct(調用,回調){}
函數 readProducts(調用,回調){}
函數 updateProduct(調用,回調) {}
函數 deleteProduct(調用,回調) {}

const 服務器 = 新的 gRPC.Server();
服務器.addService(產品包.產品.服務,{
創建產品,
讀取產品,
閱讀產品,
更新產品,
刪除產品,
});

服務器.bindAsync("0.0.0.0:4000", gRPC.ServerCredentials.createInsecure(), () => {
服務器.啟動();
});

這段代碼首先.proto使用該方法加載服務定義文件loadSync,并將其轉換為 gRPC 對象。然后從該 gRPC 對象中引用產品包。

products數組將作為您的數據庫。您將從此數組中添加、刪除、更新和查詢對象。

空數組的正下方是服務函數,我們將在其中添加在 中聲明的服務方法的實現邏輯product.proto。這些函數接受兩個參數:callcallback

參數call引用傳入的請求對象,其中包括隨該請求發送的所有參數。這callback是服務器處理程序在處理完請求后調用的函數。它用于將響應發送回客戶端或在發生錯誤時傳達錯誤。該callback函數的第一個參數接受一個錯誤對象(或者null如果沒有錯誤)。第二個參數是響應對象,用于將數據返回給客戶端。

接下來使用 gRPC 模塊創建 gRPC 服務器,并使用addService方法將服務方法添加到此服務中。最后將服務器綁定到端口并啟動。

步驟 4:使用 Postman gRPC 客戶端

現在,我們將編寫服務方法邏輯 – 并使用 Postman gRPC 客戶端來確認我們的方法按預期工作。

Postman gRPC 客戶端的 UI

Postman gRPC 客戶端可讓您輕松測試、協作和使用 gRPC API。您可以上傳 Protobuf 定義,Postman 將自動了解其所有服務和可用方法。它可以為每種方法生成示例有效負載,以及為整個服務生成模擬服務器。它支持服務器反射以及所有四種類型的數據流。

導航到工作臺左側邊欄上的API選項卡,然后單擊+圖標以創建新 API。選擇繼續而不使用存儲庫,單擊添加新定義文件,然后選擇Protobuf 3。創建定義,復制并粘貼整個 Protobuf 文件,然后單擊保存

注意:您還可以使用我們的編輯器直接在 Postman 中創作 Protobuf 文件 – 或者從遠程存儲庫導入它。

接下來創建一個新的 gRPC 請求,并將此請求保存在一個新的集合中,如下所示:

第五步:編寫服務方法邏輯

服務方法的函數已在 server.js 文件中定義。我們現在將為這些不同的方法編寫邏輯。

創建產品

createProduct方法接收一個產品對象并將其推送到數據庫數組。產品對象從中獲取request.data。此數據被解構為包含產品 ID 的新對象。然后,將新對象推送到products數組并發送回客戶端:

函數 createProduct(調用,回調){
const 數據 = 調用.請求;

const newProductData = {...數據,id:產品.length + 1};

產品.推送(新產品數據);

返回回調(null,newProductData);
}

添加此代碼后,使用以下命令啟動服務器:

節點服務器.js

導航到您的 Postman Collection 并創建一個名為“創建產品”的新 gRPC 請求。

將服務器 URL ( 0.0.0.0:4000) 復制并粘貼到服務器 URL 輸入框中,然后單擊選擇方法。選擇您在上一步中創建的 API 的名稱。這應該會加載您的所有服務方法。選擇createProduct方法。然后,在消息選項卡中,單擊使用示例消息或手動添加產品消息。修改示例消息以滿足您的需求,然后單擊調用:

您將收到包含新創建產品數據的響應,該響應可保存為此請求的示例響應:

ReadProduct 和 ReadProducts

要讀取單個產品,您將使用其 ID 在產品數組中搜索它。 如果數組中不存在具有指定 ID 的產品,則該函數將返回 gRPC 錯誤,并帶有預定義狀態代碼之一:

函數 readProduct(調用,回調){
const productId = 調用.請求.id;
const selectedProduct = products.find(product => product.id === productId);

如果(selectedProduct){
返回回調(null,selectedProduct);
} 別的 {
打回來({
代碼:gRPC.status.NOT_FOUND,
詳細信息:“找不到具有指定 ID 的產品”
});
}
}

要讀取所有產品,只需將產品數組返回給客戶端:

函數 readProducts(調用,回調){
返回回調(null,{產品});
}

重新啟動服務器,導航到您的集合,然后分別使用方法readProduct和創建兩個新的 gRPC 請求readProducts。正如我們所解釋的,該readProduct方法接受id作為其消息并僅返回指定的產品(如果該產品不存在則返回錯誤),而readProducts消息返回所有產品的數組:

更新產品

要更新產品,我們首先使用其 ID 在產品數組中找到它。然后,我們創建一個新對象,其中包含來自請求的更新產品信息。請求中未包含的任何字段都將保留其當前值。然后,這個新對象將替換產品數組中的現有對象:

函數更新產品(調用,回調){
const productInfo = 調用.請求;

const productIndex = products.findIndex(product => product.id === productInfo.id);

如果(!productIndex){
返回回調({
代碼:gRPC.status.NOT_FOUND,
詳細信息:“無法找到要更新的具有指定 ID 的產品”
});
}

const selectedProduct = 產品[productIndex];

const updatedProduct = {
id:selectedProduct.id,
名稱:productInfo.name ??selectedProduct.name,
描述:productInfo.description??selectedProduct.description,
價格:productInfo.price??selectedProduct.price,
類別:productInfo.category??selectedProduct.category,
}

產品.拼接(產品索引, 1,更新產品);

返回回調(null,updatedProduct);
}

重啟服務器,導航到您的收藏,然后添加UpdateProduct請求。提供您要更新的產品的 ID,以及您要更新的屬性:

單擊“調用”。然后,導航到該viewProducts方法并調用它以確認具有指定 ID 的產品確實已更新。

刪除產品

要刪除產品,我們將使用請求中的產品 ID 在產品數組中找到該產品的索引。然后我們將使用此索引從數組中刪除產品對象:

函數 deleteProduct(調用,回調){
const productId = 調用.請求.id;
const productIndex = products.findIndex(product => product.id === productId);
如果(!productIndex){
返回回調({
代碼:gRPC.status.NOT_FOUND,
詳細信息:“無法找到要刪除的具有指定 ID 的產品”
});
}

產品.拼接(產品索引,1);

返回回調(null,{deleted:true});
}

重新啟動服務器,在集合中創建一個新的請求,并deleteProduct在特定的 ID 上調用該方法:

最后,調用該ReadProducts方法來確認具有指定 ID 的產品確實已被刪除。

其他資源

我們在本教程中涵蓋了很多內容。我們設置了一個 Node.js 項目,使用 Protobuf 創建了一個 gRPC 服務,并設置了一個基本服務器。然后,我們為 gRPC 服務編寫了服務函數,并了解了 Postman gRPC 客戶端如何幫助您更有效地使用 gRPC API。

上一篇:

米游社查詢 API:原神玩家數據獲取與應用

下一篇:

深度學習入門系列:VGG、NiN、GoogleNet
#你可能也喜歡這些API文章!

我們有何不同?

API服務商零注冊

多API并行試用

數據驅動選型,提升決策效率

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

對比大模型API的內容創意新穎性、情感共鳴力、商業轉化潛力

25個渠道
一鍵對比試用API 限時免費

#AI深度推理大模型API

對比大模型API的邏輯推理準確性、分析深度、可視化建議合理性

10個渠道
一鍵對比試用API 限時免費