nodeでmessagepackのdecodeにハマった
APIクライアントを適当に書いてる時に、何かdecodeうまく行かない問題にハマった
decodeに使ったライブラリ
https://github.com/kawanet/msgpack-lite
jsでdecodeしようと思ったら多分これになる?ハズ
ダメだったコード例
var request = require("request"); request.get({ url:"http://localhost:3000" }, function (error, responce, body){ var msgpack = require("msgpack-lite"); var data = msgpack.decode(body); console.log(data); });
最初は公式のexsampleに従ったままサクッとできると思ったらエラー
(略)/msgpack-lite/lib/read-core.js:24 if (!func) throw new Error("Invalid type: " + (type ? ("0x" + type.toString(16)) : type)); ^ Error: Invalid type: 0x�
http経由だとそんな簡単じゃないのかーなんて思いつつ、Unit8Arrayとかもゴニョりつつ 色々ググりながら試していっても中々解決できず。 最終的にはバッファの値がなぜか同一じゃないことに気づく。これ普通一緒なんじゃ・・・
■元のバイナリのバッファ <Buffer 81 a4 74 65 73 74 a4 74 65 73 74> ■上記例コードのbodyのバッファ <Buffer ef bf bd ef bf bd 74 65 73 74 ef bf bd 74 65 73 74>
そもそも受け取るデータがエンコードした時点のバッファと違かったら正しくデコード出来ないよね? という事で別のライブラリを利用したらあっさり解決。
var http = require("http"); var options = { hostname: 'localhost', port: 3000, path: '/' }; var req = http.get(options, function(res){ var output = ''; res.on('data', function(chunk){ var msgpack = require("msgpack-lite"); output = msgpack.decode(chunk); }); res.on('end', function(){ console.log(output); }); }); req.end();
ライブラリ変えたらあっさり解決するの理不尽すぎた。 requestライブラリ使っても問題なくデコードする方法もあるんだろうけど うまく解決できず。諦め