Http-proxy-middleware: How can I print out request bodies

Created on 29 Jun 2017  路  9Comments  路  Source: chimurai/http-proxy-middleware

Hi, I'm trying to create a small development proxy to print out to the console headers, query params, and body.

But I can't get the body and prioxy to work together, and all my research had not given me any obvious solution.

In the code below, when I enable bodyParsers, I get the body printed to the console, but any PUT or POST request that contains a body ends up hanging. With no bodyParsers, req.body is undefined (as pre express docs) and the proxied request completes successfully.

Any advise on how I might approach this?

Thanks in advance.

var express = require('express');
var app = express();
var bodyParser = require('body-parser');
var proxy = require('http-proxy-middleware');

var apiProxy = proxy({
    target: 'http://localhost:7040',
    changeOrigin: true,
    onError: function(err, req, res) {
        console.error(err.message);
        res.writeHead(500, { 'Content-Type': 'text/plain' });
        res.end(err.message);
    }
});

// When enabled I get body output, but server/proxy hangs and request never completes.
app.use(bodyParser.raw());
app.use(bodyParser.text());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());

app.use(function(req, res, next) {

    console.log('\n\nHeaders');
    console.log(req.headers);

    console.log('\nQuery');
    console.log(req.query);

    console.log('\nBody');
    console.log(req.body);

    next();
});

app.use(apiProxy);
app.listen(8888);

Most helpful comment

Found that it is possible to do it with the bodyParser middleware by following this example which shows the need to re-stream the body in the onProxyReq method.

All 9 comments

mount your apiProxy before mounting the bodyParser middlewares should fix the issue.

Thanks for the suggestion. I did try this. I get a working proxy, but get 'undefined' for req.body (probably because then bodyParsers are now after my app.use() that dumps the data.)

If I put apiProxy before my app.use(), my app.use() never gets called.

Update - I had success using the npm 'body' package rather 'body-parser'.

@garyns work for me

@garyns can you tell the sample how it worked for you. When I am using npm body still my socket is hanging.

can you please show an example of how to use body ?
thanks

Hi @chimurai

Would you mind adding the "mount your apiProxy before mounting the bodyParser middlewares" nugget to the README file?

I just spent three days trying to figure out why my proxy was hanging, until I stumbled upon this issue.
Might save someone else the trouble...

Thanks,

const anyBody = require('body/any')
onProxyReq(proxyReq, req, res) {
    anyBody(req, res, function (err, body) {
        if (err) console.error(err)
        console.log(body)
    })
})

Found that it is possible to do it with the bodyParser middleware by following this example which shows the need to re-stream the body in the onProxyReq method.

Was this page helpful?
0 / 5 - 0 ratings

Related issues

DylanPiercey picture DylanPiercey  路  6Comments

pwlerke picture pwlerke  路  6Comments

zh-h picture zh-h  路  3Comments

lukaszpochrzest picture lukaszpochrzest  路  3Comments

dzz9143 picture dzz9143  路  3Comments