Expressを使用している場合、コードは次のとおりです。
app.use(express.bodyParser());
生のリクエスト本文を取得するにはどうすればよいですか?
回答:
編集2:ボディパーサーモジュールのリリース1.15.2では、ボディをバッファーとして返すrawモードが導入されています。デフォルトでは、deflateとgzipの解凍も自動的に処理します。使用例:
var bodyParser = require('body-parser');
app.use(bodyParser.raw(options));
app.get(path, function(req, res) {
// req.body is a Buffer object
});
デフォルトでは、options
オブジェクトには次のデフォルトオプションがあります。
var options = {
inflate: true,
limit: '100kb',
type: 'application/octet-stream'
};
生のパーサーで以外の他のMIMEタイプを解析するapplication/octet-stream
場合は、ここで変更する必要があります。*/*
またはなどのワイルドカードマッチングもサポートし*/application
ます。
注:次の回答は、ミドルウェアがまだフレームワークにバンドルされているExpress4より前のバージョンに対するものです。最新の同等物はbody-parserモジュールであり、個別にインストールする必要があります。
rawBody
Expressのプロパティはかつて利用可能でしたが、バージョン1.5.1以降削除されました。生のリクエストボディを取得するには、bodyParserを使用する前にミドルウェアを挿入する必要があります。ここでそれに関するGitHubのディスカッションを読むこともできます。
app.use(function(req, res, next) {
req.rawBody = '';
req.setEncoding('utf8');
req.on('data', function(chunk) {
req.rawBody += chunk;
});
req.on('end', function() {
next();
});
});
app.use(express.bodyParser());
そのミドルウェアは実際のデータストリームから読み取り、それをrawBody
リクエストのプロパティに保存します。次に、次のように未加工のボディにアクセスできます。
app.post('/', function(req, res) {
// do something with req.rawBody
// use req.body for the parsed body
});
編集:このメソッドとbodyParserは共存を拒否しているようです。これは、一方が他方よりも先にリクエストストリームを消費し、どちらかが2番目に起動しend
ないためnext()
、呼び出しが行われず、アプリケーションがハングするためです。
最も簡単な解決策は、ConnectのJSONパーサーの57行目にあるbodyParserのソースを変更することです。これは、変更されたバージョンがどのように見えるかです。
var buf = '';
req.setEncoding('utf8');
req.on('data', function(chunk){ buf += chunk });
req.on('end', function() {
req.rawBody = buf;
var first = buf.trim()[0];
...
});
次の場所にファイルがあります。
/node_modules/express/node_modules/connect/lib/middleware/json.js
。
bodyParserのverify
コールバックを使用して、bodyParserでうまく機能するソリューションを入手しました。このコードでは、これを使用してコンテンツのsha1を取得し、生のボディも取得しています。
app.use(bodyParser.json({
verify: function(req, res, buf, encoding) {
// sha1 content
var hash = crypto.createHash('sha1');
hash.update(buf);
req.hasha = hash.digest('hex');
console.log("hash", req.hasha);
// get rawBody
req.rawBody = buf.toString();
console.log("rawBody", req.rawBody);
}
}));
私はNode.jsとexpress.js(文字通り昨日開始しました!)を初めて使用するので、このソリューションに関するコメントを聞きたいと思います。
req.rawBody = buf.toString();
はそれだけで、verify
機能が美しく機能したので、関数を含めて残りを削除しました。bodyParserのソースコードを変更する必要はありません!
req.rawBody = buf.toString(encoding);
application/json
リクエストのみをキャプチャします
この解決策は私のために働いた:
var rawBodySaver = function (req, res, buf, encoding) {
if (buf && buf.length) {
req.rawBody = buf.toString(encoding || 'utf8');
}
}
app.use(bodyParser.json({ verify: rawBodySaver }));
app.use(bodyParser.urlencoded({ verify: rawBodySaver, extended: true }));
app.use(bodyParser.raw({ verify: rawBodySaver, type: '*/*' }));
req.on('data', function(chunk) { });
チャンクされたリクエスト本文で機能しないソリューションを使用する場合。
json、urlencodedなどもサポートしようとしている場合はbodyParserで正しく再生されないため、他の回答には注意してください。bodyParserで機能させるには、ハンドラーを条件付けして、Content-Type
ヘッダーにのみ登録する必要があります。 bodyParser自体と同じように気にします。
リクエストの未加工の本文コンテンツを取得するには、次の操作Content-Type: "text/plain"
をreq.rawBody
実行できます。
app.use(function(req, res, next) {
var contentType = req.headers['content-type'] || ''
, mime = contentType.split(';')[0];
if (mime != 'text/plain') {
return next();
}
var data = '';
req.setEncoding('utf8');
req.on('data', function(chunk) {
data += chunk;
});
req.on('end', function() {
req.rawBody = data;
next();
});
});
app.use(bodyParser.urlencoded({limit: '80mb', extended: true})); app.use(bodyParser.json({limit: '80mb'})); app.use(bodyParser.raw({type: 'application/octet-stream'}))
これも可能です。
これは、上記のヘキサシアニドの答えのバリエーションです。このミドルウェアは「data」イベントも処理しますが、「next」を呼び出す前にデータが消費されるのを待ちません。このようにして、このミドルウェアとbodyParserの両方が共存し、ストリームを並行して消費する可能性があります。
app.use(function(req, res, next) {
req.rawBody = '';
req.setEncoding('utf8');
req.on('data', function(chunk) {
req.rawBody += chunk;
});
next();
});
app.use(express.bodyParser());
body-parserを使用します。ボディを次のように解析します。
app.use(bodyParser.text());
app.use(bodyParser.urlencoded());
app.use(bodyParser.raw());
app.use(bodyParser.json());
すなわち。生のテキストファイルを取得することになっている場合は、を実行し.text()
ます。
それがbody-parserが現在サポートしているものです