Node.js,协议缓冲区和Ubuntu的 – 如何让它工作?

以下是我用来在node.js中加载一个proto文件的步骤。 总的来说,我如何获得协议缓冲区来处理node.js?

1)将协议缓冲区下载并安装到此位置。

/home/ubuntu/Downloads/protobuf-2.4.1 

2)从这个回购下载了这个protobuf-for-node修复。 我将该文件夹放置在我的node.js应用程序文件夹的node_modules文件夹中。

 git://github.com/pzgz/protobuf-for-node.git 

3)执行以下命令

 cd node_modules/protobuf-for-node PROTOBUF=~/Downloads/protobuf-2.4.1 /usr/local/bin/node-waf configure clean build 

4)将下列文件移到这些位置:

 cp node_modules/protobuf-for-node/protobuf_for_node.h /usr/local/include/node cp node_modules/protobuf-for-node/build/Release/protobuf_for_node_lib.so /usr/local/lib 

5)执行以下命令来构build随node.js一起提供的feeds.proto示例

 cd node_modules/protobuf-for-node/example protoc --descriptor_set_out=feeds.desc --include_imports feeds.proto 

6)在应用程序中,我添加了这一行。

 var express = require('express'), routes = require('./routes'); var fs = require('fs'); var puts = require('util').puts; url = require('url'); moment = require('moment'); var uuid = require('node-uuid'); var app = module.exports = express.createServer(); var Schema = require('protobuf_for_node').Schema; var schema = new Schema(fs.readFileSync('/home/ubuntu/workspace/rtbopsConfig/rtbServers/rtbNodejsServer/node_modules/protobuf-for-node/example/feeds.desc')); 

7)这是我的错误。

 module.js:337 throw new Error("Cannot find module '" + request + "'"); ^ Error: Cannot find module 'protobuf_for_node' at Function._resolveFilename (module.js:337:11) at Function._load (module.js:279:25) at Module.require (module.js:359:17) at require (module.js:375:17) at Object.<anonymous> (/home/ubuntu/app.js:9:14) at Module._compile (module.js:446:26) at Object..js (module.js:464:10) at Module.load (module.js:353:31) at Function._load (module.js:311:12) at Array.0 (module.js:484:10) 

考虑使用这个库的分支:

https://github.com/chrisdew/protobuf/

它似乎更积极的维护和更好的文档。 安装它是npm是微不足道的,做一个require('protobuf')工作正常。

对于Ubuntu,我需要安装以下软件来获取安装了npm的软件包并获得编译好的原始文件:

sudo apt-get install libprotobuf-dev protobuf-compiler

看起来你已经有这些,但手动安装。

下面是我为https://github.com/chrisdew/protobuf/issues/29所做的一个例&#x5B50; – 大多数用户不需要字节字段的复杂性。

buftest.proto

 package com.chrisdew.buftest; message BufTest { optional float num = 1; optional bytes payload = 2; } 

buftest.js

 var fs = require('fs'); var Schema = require('protobuf').Schema; // "schema" contains all message types defined in buftest.proto|desc. var schema = new Schema(fs.readFileSync('buftest.desc')); // The "BufTest" message. var BufTest = schema['com.chrisdew.buftest.BufTest']; var ob = { num: 42 }; ob.payload = new Buffer("Hello World"); var proto = BufTest.serialize(ob); console.log('proto.length:', proto.length); var outOb = BufTest.parse(proto); console.log('unserialised:', JSON.stringify(outOb)); var payload = new Buffer(outOb.payload); console.log(payload); 

Makefile:(第二行以TAB开头不是空格)

 all: protoc --descriptor_set_out=buftest.desc --include_imports buftest.proto 

输出:

 $ node buftest.js proto.length: 18 unserialised: {"num":42,"payload":{"0":72,"1":101,"2":108,"3":108,"4":111,"5":32,"6":87,"7":111,"8":114,"9":108,"10":100,"length":11}} payload: <Buffer 48 65 6c 6c 6f 20 57 6f 72 6c 64>