【问题标题】:webpack config proxy request body loggingwebpack 配置代理请求正文日志记录
【发布时间】:2018-08-29 18:59:37
【问题描述】:

Webpack 开发服务器代理配置文档见此处:

https://webpack.js.org/configuration/dev-server/#devserver-proxy

说它使用 http-proxy-middleware:

https://github.com/chimurai/http-proxy-middleware#http-proxy-events

使用上述链接中记录的onProxyRes 函数,我执行以下操作:

function onProxyRes(proxyRes, req, res) {
    proxyRes.headers['x-added'] = 'foobar';     // add new header to response
    delete proxyRes.headers['x-removed'];       // remove header from response
    console.log(req.headers)                    // log headers
    console.log(req.body)                  // undefined
    console.log(proxyReq.body)             // undefined
}

我的问题,虽然其他一切都很好 - 我无法记录请求正文 - 它返回 undefined

有人知道如何读取请求正文以进行调试吗?我是否需要使用 npm body-parser 模块?如果是这样,怎么做?谢谢

【问题讨论】:

    标签: node.js webpack webpack-dev-server http-proxy-middleware


    【解决方案1】:

    我尝试使用 express body-parser 模块记录请求,但它导致请求挂起。使用body 模块记录请求正文已修复它。

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

    请注意,我在 express 中也使用了相同的方法,如下所示:

    app.use((req, res, next) => {
        anyBody(req, res, function (err, body) {
            if (err) console.error(err)
            console.log(body)
        })
        next()
    })
    

    【讨论】:

    • 虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值。
    【解决方案2】:

    我使用body-parser 解决了类似的问题。

    我试图在将请求正文发送到服务器之前对其进行修改,这导致请求挂起,可能是因为更改正文后,请求的 Content-Length 不再匹配(导致它被截断)。

    解决方案是在编写新请求正文之前“调整大小”Content-Length

    var bodyParser = require('body-parser');   
    
    devServer: {
        before: function (app, server) {
            app.use(bodyParser.json());
        },
        onProxyReq: function (proxyReq, req, res) {
            req.body = {
                ...req.body,
                myProperty: "myPropertyValue"
            };
    
            const body = JSON.stringify(req.body);
    
            proxyReq.setHeader('Content-Length', Buffer.byteLength(body));
    
            proxyReq.write(body);
        }
    }
    

    不确定,但在您的情况下,可能是请求已被添加/删除标头截断,导致它挂起。

    【讨论】:

    • 谢谢!最后是一个干净的解决方案。