私はクライアントからのメトリックを書く必要がある単純なノードアプリケーションを持っています。 クライアントはPythonのzlibモジュールでzipされたjson形式のメトリックを送信します。私はエクスプレスbodyParseが行われる前にリクエスト投稿を解凍するミドルウェアを追加しようとしています。ノード+エクスプレスでPOSTボディを解凍
私のミドルウェアは、単にデフォルトで特急が提供するものです。
app.configure(function(){
app.set('port', process.env.PORT || 3000);
app.set('views', __dirname + '/views');
app.set('view engine', 'jade');
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(express.cookieParser('your secret here'));
app.use(express.session());
app.use(app.router);
app.use(require('less-middleware')({ src: __dirname + '/public' }));
app.use(express.static(path.join(__dirname, 'public')));
});
私はデータを取得し、それを解凍シンプルなミドルウェアを追加しようとしました:
app.use(function(req, res, next) {
var data = '';
req.addListener("data", function(chunk) {
data += chunk;
});
req.addListener("end", function() {
zlib.inflate(data, function(err, buffer) {
if (!err) {
req.body = buffer;
next();
} else {
next(err);
}
});
});
});
問題zlib.inflateを使用しています。私はこのエラーを受け取ります:
Error: incorrect header check
データが圧縮されていますPythonのzlibモジュール:
zlib.compress(jsonString)
しかし、unzip、inflate、gunzipはどちらも動作していないようです。自分で解決策を見つけた
はあなたがzlib.unzipから「ERR」を取得し、結果としてはありませんよろしいですnext()は呼び出されませんか?そのような場合は、データを配列に切り替えてみてください。この回答を調べるhttp://stackoverflow.com/a/12776856/30763さらに、bodyParserの前にミドルウェアが使用されていることを確認してください。 – Aaron
その答えは、クライアントではなくノードによって行われた要求を解凍するためのものではありませんか?いずれの場合でも – alex88
@ alex88の場合、エラーがある場合は 'next(err)'を呼び出す必要があります。また、 'bodyParser'ミドルウェアを忘れ、' req.body = JSON.parse(buffer) 'を直接行うことをお勧めします。 –