Protocol Buffer在Node.js中的应用

1. Protocol Buffer 简介

先引用官网的一段话:

Protocol buffers are Google's language-neutral, platform-neutral, extensible mechanism for serializing structured data – think XML, but smaller, faster, and simpler. You define how you want your data to be structured once, then you can use special generated source code to easily write and read your structured data to and from a variety of data streams and using a variety of languages.
协议缓冲区(Protocol Buffe)是Google的与语言无关,与平台无关的可扩展机制,用于对结构化数据进行序列化(例如XML),但更小,更快,更简单。您定义要一次构造数据的方式,然后可以使用生成的特殊源代码轻松地使用各种语言在各种数据流中写入和读取结构化数据。

其实我并不真正理解官网对其的定义,但是在我们的Node.js项目中,我一般将其当作过滤器来使用,更多的是让它发挥一种规范数据结构的作用,以防止不被期望的数据破坏我们的接口逻辑。所以,想深入学习的小伙伴可以参考官网,官方文档在此

2. 使用场景

我们在开发某一接口时,通常会先定义好请求和响应的数据结构,并且我们希望我们的接口是按照预期工作的,所以我们会写好接口文档给调用接口的开发者看,但是文档和口头约定并不是一种强约束,我们不能凭此就认为接口的输入是我们预期的那样,所以我们在处理接口的请求参数时需要做一些检查来排除不被预期的参数,比如你有一个接口list用来查询某一数据列表,如果这个接口查询条件比较简单,我们可能直接用for循环遍历req.query来构造我们的sql,但是如果里面多了一些其他的参数,可能list接口就不能返回预期的数据,导致接口的鲁棒性非常差。所以在接口开始工作前,对请求参数的处理时非常必要的,这时,如果我们事先定义好了属于该接口的.proto文件,我们就可以通过它去过滤掉我们不需要的,或者未定义的参数。

3. Protocol 3 语法

我们可以通过一个简单的示例来让大家有一个初步的认识:

// 数据结构
{
  name: 'Bing Xu',
  age: 24,
  hobbies: ['game', 'coding', 'reading'],
  major: {
           name: 'IS',
           period: '4years'
          },
  done: 1 // 是否毕业,1 是 2 否 代表这个字段的值是可枚举的
}

// proto
syntax = "proto3"; // 申明版本,否则会默认proto2

message Information {
  required string name = 1;  // required 表示该字段必填
  optional int32 age = 2;    // optional 表示可选字段
  repeat string hobbies = 3;   // repeat 表示后面的数据结构是可以重复的,也就是数组
  
  message Major {  // 这里面又定义了一种结构
    required string name = 1;
    required string period = 2;
  }
  optional Major major = 4;  // 在这里使用上面定义的结构

  enum Done { // 用enum关键字定义可枚举结构
    YES = 1 // 已完成
    NO = 2 // 未完成
  }
  optional Done done = 5;
}

这里有一个大坑就是在Node.js中使用proto需要注意的是,字段前面的类似于optionalrequired是必须要写的,不写会报错,但是在其他语言中,比如在Golang中使用就没有这种限制。更多语法请参考官方文档

4. 调用方法

我们一般会在项目中封装好调用的方法,我在这里写一个简单的示例:

const ProtoBuf = require("protobufjs");

function asyncProto(message, body) {
 // 这里其实不可能传入message对象的,一般会传一个名称,然后动态生成path,通过load方法去拿到message
  return new Promise((resolve, reject) => {
    const err = message.verify(body)
    if (err) return reject(err)  // 如果验证出错了,说明数据不符合该数据结构
    data = messate.create(body) // 如果验证通过,会使用该数据结构重新生成一份数据,过滤掉不要的参数
    resolve(data)
  });
}

// 然后我们可以在接口里使用
async function list (req, res) {  
  const query = await asyncProto(message, req.query) // 过滤得到符合要求的查询条件
  // do something
}

5. 结束语

本篇文章写得比较粗糙,因为笔者也没有深入的学习,只是大概看了下文档,在语法方面,应该能满足大部分需求了~希望能够对读者有一定的帮助。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,198评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,663评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,985评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,673评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,994评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,399评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,717评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,407评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,112评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,371评论 2 241
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,891评论 1 256
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,255评论 2 250
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,881评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,010评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,764评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,412评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,299评论 2 260

推荐阅读更多精彩内容