6

bodyParserExpress が起動しない場合、リクエストで POST データにアクセスするにはどうすればよいですか?

var server = express();
server.use(express.bodyParser());
server.post('/api/v1', function(req, resp) {
  var body = req.body;
  //if request header does not contain 'Content-Type: application/json'
  //express bodyParser does not parse the body body is undefined
  var out = {
    'echo': body
  };
  resp.contentType('application/json');
  resp.send(200, JSON.stringify(out));
});

注: ExpressJs 3.x+ ではreq.body、自動的に使用可能になるわけではなく、bodyParserアクティブ化する必要があります。

コンテンツ タイプ ヘッダーが設定されていない場合、デフォルトのコンテンツ タイプを指定してapplication/jsonbodyParser?

それ以外の場合、このエクスプレス POST 関数内から裸の nodejs の方法を使用して POST データにアクセスすることは可能ですか?

(例req.on('data', function...)

4

3 に答える 3

3

bodyParser が作動する前に、私はこのミドルウェアを使用しています。リクエスト ストリームの最初のバイトを調べて推測します。この特定のアプリは、XML または JSON テキスト ストリームのみを実際に処理します。

app.use((req,res, next)=>{
    if (!/^POST|PUT$/.test(req.method) || req.headers['content-type']){
        return next();
    }
    if ((!req.headers['content-length'] || req.headers['content-length'] === '0') 
            && !req.headers['transfer-encoding']){
        return next();
    }
    req.on('readable', ()=>{
        //pull one byte off the request stream
        var ck = req.read(1);
        var s = ck.toString('ascii');
        //check it
        if (s === '{' || s==='['){req.headers['content-type'] = 'application/json';}
        if (s === '<'){req.headers['content-type'] = 'application/xml'; }
        //put it back at the start of the request stream for subsequent parse
        req.unshift(ck);
        next();
    });
});
于 2016-02-02T11:52:46.770 に答える
1

Express 4.x では、同じ問題があり、クライアントの動作が正しくなく、コンテンツ タイプが送信されませんでした。いくつかの設定を express.json() に渡すとうまくいきました:

app.use(express.json({inflate: true, strict: false, type: () => { return true; } }));
于 2021-11-26T20:31:50.887 に答える