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所做的一个例子 – 大多数用户不需要字节字段的复杂性。
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>