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。

熱門推薦
一個賬號試用1000+ API
助力AI無縫鏈接物理世界 · 無需多次注冊
3000+提示詞助力AI大模型
和專業工程師共享工作效率翻倍的秘密
返回頂部
上一篇
API優先:挑戰與最佳策略 - Apidog
下一篇
Bazel遠程緩存API - Bitrise博客
国内精品久久久久影院日本,日本中文字幕视频,99久久精品99999久久,又粗又大又黄又硬又爽毛片
成人欧美一区二区三区| 久久一夜天堂av一区二区三区| 中文字幕在线不卡一区 | ...xxx性欧美| 久久久91精品国产一区二区精品| 亚洲一区二区三区四区不卡| 日韩精品视频网| 亚洲一区二区中文在线| 麻豆精品一区二区综合av| 欧美蜜桃一区二区三区| 国产精品久久一级| 久久国产麻豆精品| 高清不卡在线观看av| 国产精品69毛片高清亚洲| 中文字幕日韩av资源站| eeuss鲁一区二区三区| 亚洲一级片在线观看| 国产成人鲁色资源国产91色综| 久久嫩草精品久久久久| av在线不卡电影| 久久婷婷色综合| 91亚洲午夜精品久久久久久| 一本久久精品一区二区| 狠狠网亚洲精品| 亚洲欧美电影一区二区| 日本道色综合久久| 欧美一区二区福利在线| 亚洲123区在线观看| 日本在线不卡视频| 亚洲国产成人高清精品| 欧美精品第1页| 99精品视频中文字幕| 久久国产乱子精品免费女| 国产aⅴ精品一区二区三区色成熟| 伊人夜夜躁av伊人久久| 成人不卡免费av| 国产电影精品久久禁18| 一区二区在线观看免费| 亚洲成人av中文| 中文字幕不卡在线观看| 日韩一区二区在线观看| 尤物在线观看一区| 一区二区三区四区亚洲| 免费成人在线视频观看| 91精品国产综合久久精品app| 日韩一区二区在线播放| 欧美色图一区二区三区| 一区二区三区成人在线视频| 亚洲一区二区视频在线观看| 国产大片一区二区| av高清久久久| 色综合久久综合网97色综合 | 国产一区二区看久久| 日本在线不卡视频| 91麻豆免费在线观看| 91福利国产精品| 色婷婷狠狠综合| 欧美一区二区私人影院日本| 日本一区二区不卡视频| 亚洲免费av高清| 图片区小说区区亚洲影院| 一区二区三区四区精品在线视频| 成人av一区二区三区| 欧美一区二区大片| 日韩电影网1区2区| 亚洲电影一级黄| 日韩电影在线一区| 午夜精品一区二区三区免费视频| 国产精品国产三级国产aⅴ原创| 蜜桃视频第一区免费观看| 日韩**一区毛片| 国产91富婆露脸刺激对白| 欧亚一区二区三区| 午夜成人免费电影| 欧亚一区二区三区| 午夜电影久久久| 日韩高清不卡在线| 精品人伦一区二区色婷婷| 精品对白一区国产伦| 在线观看欧美黄色| 国产精品网曝门| 国产精品美女久久久久aⅴ国产馆 国产精品美女久久久久av爽李琼 国产精品美女久久久久高潮 | 热久久久久久久| 国产亚洲一区二区三区| 在线观看国产日韩| 亚洲视频免费在线观看| 一区二区三区在线免费观看| 日本一区二区三区久久久久久久久不 | 日韩精品福利网| 另类欧美日韩国产在线| 99久久国产综合精品麻豆| 亚洲乱码国产乱码精品精小说| 高清免费成人av| 免费av成人在线| 视频一区视频二区中文| 亚洲成人综合网站| 亚洲色图制服诱惑| 欧美一区欧美二区| 欧美丝袜第三区| 成人综合婷婷国产精品久久免费| 日本一区二区三区高清不卡| 2021久久国产精品不只是精品| 精品国产伦一区二区三区观看体验| 日韩欧美在线不卡| 制服丝袜国产精品| 久久久久国色av免费看影院| 777午夜精品视频在线播放| 欧美日本一区二区三区四区 | 狠狠网亚洲精品| 成人av网站在线观看免费| 日韩av在线播放中文字幕| 久久尤物电影视频在线观看| 欧美午夜一区二区| 国产日韩欧美一区二区三区综合 | 亚洲已满18点击进入久久| 日韩毛片精品高清免费| 久久精品国产精品亚洲综合| 99久久精品情趣| 欧美大片一区二区| 精品奇米国产一区二区三区| 亚洲a一区二区| 精品久久国产97色综合| 中文幕一区二区三区久久蜜桃| 捆绑变态av一区二区三区| 精品制服美女丁香| 激情综合网最新| 在线成人av影院| 亚洲摸摸操操av| 欧美日韩免费一区二区三区| 国产精品亚洲а∨天堂免在线| 91在线精品一区二区| 欧美一卡2卡3卡4卡| 亚洲免费在线看| 色8久久精品久久久久久蜜| 国产精品理论在线观看| 国产99久久精品| 亚洲一区二区三区四区在线| 欧美精品乱码久久久久久按摩| 水野朝阳av一区二区三区| 精品视频色一区| 国产成人亚洲综合色影视| 亚洲欧美在线视频观看| 欧美一卡二卡三卡| 欧美中文字幕一区二区三区亚洲 | 精品国产免费人成在线观看| 国产成人综合精品三级| 亚洲图片欧美一区| 亚洲乱码日产精品bd| 亚洲国产一区二区视频| 亚洲一区二区三区影院| 亚洲色图一区二区| 99久久免费精品| av一二三不卡影片| 亚洲成人资源网| 日本中文字幕一区二区有限公司| 国产成人精品亚洲午夜麻豆| 亚洲v日本v欧美v久久精品| 日韩理论在线观看| 7777精品伊人久久久大香线蕉超级流畅 | 国产呦精品一区二区三区网站| 色猫猫国产区一区二在线视频| 欧美成人精品高清在线播放 | 成人一区二区视频| 精品国产人成亚洲区| 欧美日韩激情一区二区| 正在播放亚洲一区| 91福利视频在线| 色香色香欲天天天影视综合网| 日韩av一区二区在线影视| av亚洲产国偷v产偷v自拍| 国内精品第一页| 天堂久久一区二区三区| 亚洲永久免费av| 9i在线看片成人免费| 国产不卡视频在线播放| 国产自产视频一区二区三区| 91久久精品网| 中文av字幕一区| 日韩不卡免费视频| 69堂成人精品免费视频| 日韩欧美成人一区二区| 亚洲男人天堂一区| 国产成人精品免费网站| 88在线观看91蜜桃国自产| 久久久久88色偷偷免费| 一区二区三区在线播放| 日韩欧美亚洲国产精品字幕久久久| 豆国产96在线|亚洲| 一区二区三区在线观看欧美| 激情五月婷婷综合| 久久综合99re88久久爱| 国产精品午夜在线观看| 亚洲成人综合网站| 国产高清亚洲一区| 亚洲aaa精品| 成人网在线播放| 亚洲免费视频中文字幕| 欧美精品在线观看播放| 欧美激情资源网| 国产精品一区二区久久精品爱涩|