web-dev-qa-db-ja.com

Expressでjsonの代わりにプレーンテキストとしてリクエストボディを強制的に解析するにはどうすればよいですか?

私は次のように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で本文をプレーンテキスト/文字列として解析する最も簡単な方法は何ですか?

34
pathikrit

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);
})
_

お役に立てれば。

22
JP Richardson

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);

})
25
Nacho

デフォルトでは、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:"*/*"}));

ドキュメントを見つけることができます こちら

24
Raghu

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....
}); 
3
Carlos

やったよ:

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);

})
1
vpmayer

Expressは、コンテンツタイプごとに本文のデコード方法を理解します。 4.xからライブラリに組み込まれているミドルウェアに特定のデコーダーが必要です。

app.use(express.text())
app.use(express.json())
0
dimpiax

ExpressおよびbodyParserのバージョンが適切なバージョンにアップグレードされていることを確認してください。 Express 〜4.xおよびbodyParser 〜1.18.x。それはそれを行う必要があります。それを適切に配置すると、次のように動作するはずです

app.use(bodyParser.text());

0
crazyDiamond