How to force parse request body as plain text instead of json in Express?

后端 未结 8 2023
死守一世寂寞
死守一世寂寞 2021-01-03 17:49

I am using nodejs + Express (v3) like this:

app.use(express.bodyParser());
app.route(\'/some/route\', function(req, res) {
  var text = req.body; // I expect         


        
相关标签:
8条回答
  • 2021-01-03 18:22

    By default bodyParser.text() handles only text/plain. Change the type options to include */json or */*.

    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:"*/*"}));
    

    You can find the docs here

    0 讨论(0)
  • 2021-01-03 18:22

    Express understands by content-type how to decode a body. It must have specific decoders in middlewares, which is embedded into the library from 4.x:

    app.use(express.text())
    app.use(express.json())
    
    0 讨论(0)
  • 2021-01-03 18:23

    In express 4.x you can use the text parser from bodyParser https://www.npmjs.org/package/body-parser

    just add in app.js

    app.use(bodyParser.text());
    

    Also in the desired route

    router.all('/',function(req,res){
        console.log(req.body);
    
    })
    
    0 讨论(0)
  • 2021-01-03 18:27

    If you remove the use of the bodyParser() middleware, it should be text. You can view the bodyParser docs for more info: http://www.senchalabs.org/connect/middleware-bodyParser.html

    Remove this line:

    app.use(express.bodyParser());
    

    EDIT:

    Looks like you're right. You can create your own rawBody middleware in the meantime. However, you still need to disable the bodyParser(). Note: req.body will still be undefined.

    Here is a demo:

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

    Hope this helps.

    0 讨论(0)
  • 2021-01-03 18:28

    Two important things to achieve this.

    1. You need to add the text middleware in order to process text in the body
    2. You need to set the content type by adding the right header "Content-type: text/plain" in the request

    Here is the sample code for both.

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

    Save this as index.js.

    Install dependencies.

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

    Run it.

    node index.js
    

    Now send a request to it.

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

    You should be able to see it sending back whatever you posted.

    0 讨论(0)
  • 2021-01-03 18:37

    You can use the plainTextParser (https://www.npmjs.com/package/plaintextparser) middleware..

    let plainTextParser = require('plainTextParser');
    app.use(plainTextParser());
    

    or

    app.post(YOUR_ROUTE, plainTextParser, function(req, res) {             
      let text = req.text;
    
      //DO SOMETHING....
    }); 
    
    0 讨论(0)
提交回复
热议问题