私は次のようにnodejs + Express(v3)を使用しています:
app.use(express.bodyParser());
app.route('/some/route', function(req, res) {
var text = req.body; // I expect text to be a string but it is a JSON
});
要求ヘッダーを確認しましたが、コンテンツタイプがありません。 「Content-Type」が「text/plain」であっても、JSONとして解析されているようです。とにかく、ミドルウェアにボディを常にJSONではなくプレーンテキスト文字列として解析するように指示する方法はありますか?以前のバージョンのreq
にはreq.rawBody
この問題を回避できますが、現在はもうありません。 Expressで本文をプレーンテキスト/文字列として解析する最も簡単な方法は何ですか?
bodyParser()
ミドルウェアの使用を削除する場合は、テキストにする必要があります。詳細については、bodyParser
ドキュメントを参照できます。 http://www.senchalabs.org/connect/middleware-bodyParser.html
この行を削除します。
_app.use(express.bodyParser());
_
あなたは正しいようです。それまでの間、独自のrawBody
ミドルウェアを作成できます。ただし、bodyParser()
を無効にする必要があります。注:_req.body
_はundefined
のままです。
デモは次のとおりです。
app.js
_var express = require('express')
, http = require('http')
, path = require('path')
, util = require('util');
var app = express();
function rawBody(req, res, next) {
req.setEncoding('utf8');
req.rawBody = '';
req.on('data', function(chunk) {
req.rawBody += chunk;
});
req.on('end', function(){
next();
});
}
app.configure(function(){
app.set('port', process.env.PORT || 3000);
app.use(rawBody);
//app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(app.router);
});
app.post('/test', function(req, res) {
console.log(req.is('text/*'));
console.log(req.is('json'));
console.log('RB: ' + req.rawBody);
console.log('B: ' + JSON.stringify(req.body));
res.send('got it');
});
http.createServer(app).listen(app.get('port'), function(){
console.log("Express server listening on port " + app.get('port'));
});
_
test.js
_var request = require('request');
request({
method: 'POST',
uri: 'http://localhost:3000/test',
body: {'msg': 'secret'},
json: true
}, function (error, response, body) {
console.log('code: '+ response.statusCode);
console.log(body);
})
_
お役に立てれば。
Express 4.xでは、bodyParserのテキストパーサーを使用できます https://www.npmjs.org/package/body-parser
app.jsに追加するだけです
app.use(bodyParser.text());
目的のルートでも
router.all('/',function(req,res){
console.log(req.body);
})
デフォルトでは、bodyParser.text()
はtext/plainのみを処理します。タイプオプションを変更して、*/json
または*/*
を含めます。
app.use('/some/route', bodyParser.text({type: '*/*'}), function(req, res) {
var text = req.body; // I expect text to be a string but it is a JSON
});
//or more generally:
app.use(bodyParser.text({type:"*/*"}));
ドキュメントを見つけることができます こちら
PlainTextParser( https://www.npmjs.com/package/plaintextparser )ミドルウェアを使用できます。
let plainTextParser = require('plainTextParser');
app.use(plainTextParser());
または
app.post(YOUR_ROUTE, plainTextParser, function(req, res) {
let text = req.text;
//DO SOMETHING....
});
やったよ:
router.route('/')
.post(function(req,res){
var chunk = '';
req.on('data', function(data){
chunk += data; // here you get your raw data.
})
req.on('end', function(){
console.log(chunk); //just show in console
})
res.send(null);
})
Expressは、コンテンツタイプごとに本文のデコード方法を理解します。 4.xからライブラリに組み込まれているミドルウェアに特定のデコーダーが必要です。
app.use(express.text())
app.use(express.json())
ExpressおよびbodyParserのバージョンが適切なバージョンにアップグレードされていることを確認してください。 Express 〜4.xおよびbodyParser 〜1.18.x。それはそれを行う必要があります。それを適切に配置すると、次のように動作するはずです
app.use(bodyParser.text());