Express.js代理请求转换流导致响应头消失

时间:2018-09-10 18:25:00

标签: node.js express stream

我有一条将请求代理到另一个URL的路由,但是我想在返回数据时进行转换(查找/替换)。因此有些奇怪的原因,当请求通过转换流进行管道传输时,它会丢失所有响应HTTP标头。知道如何保存吗?

router.get('*', function (req, res) {

    let proxyUri = // generate some url

    const ws = stream.Writable();
    ws._write = function (chunk, enc, next) {
        let fragment = chunk.toString();

        // Inject config json at the end of <head>
        if (fragment.indexOf('</head>') !== -1) {
            const configJson = JSON.stringify({
                apiBasePath: RELATIVE_PATH
            });
            fragment = fragment.replace('</head>', `<script>var config = ${configJson}</script></head>`);
        }

        res.write(fragment);

        return next();
    };

    // Proxy request
    return request({ uri: proxyUri })
        .on('error', function(err) {
            error('request:error', err);
            return res.status(500).send();
        })
        .pipe(ws)
        .on('finish', () => {
            res.end();
        });
});

我也尝试过使用类似的转换流npm包(https://github.com/eugeneware/replacestream),它也剥离了HTTP响应标头。

router.get('*', function (req, res) {

    let proxyUri = // generate some url

    // Proxy request
    return request({ uri: proxyUri })
        .on('error', function(err) {
            error('request:error', err);
            return res.status(500).send();
        })
        .pipe(replaceStream('</head>', `<script></script></head>`))
        .pipe(res)
        .on('finish', () => {
            res.end();
        });
});

0 个答案:

没有答案