DevServer 代理绕过 POST 始终请求 Returns 404 未找到

DevServer Proxy Bypass POST Request Always Returns 404 Not Found

WebPack 版本"version": "3.12.0" 开发服务器版本 "version": "2.11.3"

下面的代码片段是我配置 DevServer 代理的方式。它适用于 GET 请求,其中 returns 需要样本数据,但它不适用于通过 POSTfeedback 端点。对 /feedbackPOST 请求总是 returns 404。但是,当我将 method === 'POST' 更改为 GET 时,它将再次开始工作。

我通过在分支内抛出 Error('method: ${method}; url: ${url}')/feedback 发送 POST 请求时确认分支是可达的。

const proxyDummy = {
    '/': {
        bypass: (req) => {
            const { url, method } = req;

            if (method === 'GET') {
                switch (url) {
                    case '/data':
                        return SAMPLE_DATA.DATA; // JSON file path (Working)
                    default:
                        break;
                }
            }

            if (method === 'POST') {
                switch (url) {
                    case '/feedback':
                        return SAMPLE_DATA.FEEDBACK; // JSON file path
                    default:
                        break;
                }
            }

            return false;
        }
    }
};

再次尝试使用文档中的常规代理路由配置状态,

const proxyDummy = {
    '/data': {
        target: generateURLFrom(SAMPLE_DATA.DATA),
        pathRewrite: { '^/data': '' }
    },
    '/feedback': {
        target: generateURLFrom(SAMPLE_DATA.FEEDBACK),
        pathRewrite: { '^/feedback': '' },
        bypass: (req, res, proxyOption) => {
            if (req.method !== 'POST') return false;
        }
    }
};

还没有深入研究 DevServer 源代码,但我假设使用上面的配置代码设置代理服务器不仅仅适用于 GET 请求,下面的代理服务器是 express 所以配置像下面这样的代理服务器可以正常工作

const proxyDummy = {
    '/': {
        bypass: (req, res) => {
            const { url, method } = req;

            if (method === 'GET') {
                switch (url) {
                    case '/data':
                        return res.send('');
                    default:
                        break;
                }
            }

            if (method === 'POST') {
                switch (url) {
                    case '/feedback':
                        return res.send();
                    default:
                        break;
                }
            }

            return false;
        }
    }
};