40

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

4

8 に答える 8

37

Express 4.xでは、bodyParserhttps ://www.npmjs.org/package/body-parserのテキストパーサーを使用できます 。

app.jsを追加するだけです

app.use(bodyParser.text());

希望のルートでも

router.all('/',function(req,res){
    console.log(req.body);

})
于 2014-11-27T18:14:51.513 に答える
35

デフォルトでbodyParser.text()は、テキスト/プレーンのみを処理します。タイプオプションを変更して、*/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:"*/*"}));

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

于 2015-05-07T11:19:32.700 に答える
29

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

お役に立てれば。

于 2012-09-10T05:37:58.547 に答える
15

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

app.use(express.text())
app.use(express.json())
于 2019-08-24T20:26:36.213 に答える
3

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....
}); 
于 2016-09-01T17:05:19.187 に答える
2

これを達成するための2つの重要なこと。

  1. 本文のテキストを処理するには、テキストミドルウェアを追加する必要があります
  2. リクエストに右ヘッダー「Content-type:text / plain」を追加して、コンテンツタイプを設定する必要があります

両方のサンプルコードを次に示します。

const express = require('express');
const app = express();
const bodyParser = require('body-parser')
//This is the needed text parser middleware 
app.use(bodyParser.text()); 

app.post('/api/health/', (req, res) => {
    res.send(req.body);
});

const port = process.env.PORT || 3000;
app.listen(port, () => console.log(`Listening on ${port} ${new Date(Date.now())}`));

これをindex.jsとして保存します。

依存関係をインストールします。

npm i -S express 
npm i -S body-parser

それを実行します。

node index.js

次に、リクエストを送信します。

curl -s -XPOST -H "Content-type: text/plain" -d 'Any text or  json or whatever {"key":value}' 'localhost:3000/api/health'

あなたはそれがあなたが投稿したものは何でも送り返すのを見ることができるはずです。

于 2020-03-26T12:55:27.883 に答える
1

やったよ:

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

})
于 2017-07-21T16:41:44.763 に答える
1

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

app.use(bodyParser.text());

于 2018-01-23T01:58:59.560 に答える