在节点中创建 REST API 时,如何将来自对外部网站的请求的 http 响应流式传输到原始 api 调用?

While creating a REST API in node, How can I stream http response from a request made to an external website to the original api call?

所以,我正在使用节点创建一个 REST API,我必须创建一个路由。 路由的目的:充当代理服务器并调用不同的外部网站和 return 它对原始请求的响应。 到目前为止,我有以下代码并且有效:

app.post('/v1/something/:_id/proxy',
    function(req, res, next) {
        // Basically make a request call to some external website and return
        // the response I get from that as my own response
        var opts = {/*json containing proper uri, mehtod and json*/}
        request(opts, function (error, responseNS, b) {
            if(error) return callback(error)
            if(!responseNS) return callback(new Error('!response'))

            return res.json(responseNS.body)
        })
    }
)

我的问题是,如何流式传输从外部网站获得的这个 HTTP 响应。那样的话,我的意思是我想以流的形式获得响应,并在它以块的形式出现时立即保持 returning。 这可能吗?

您可以通过管道将来自外部源的传入响应直接传送到您的应用发送到浏览器的响应,如下所示:

app.post('/v1/something/:_id/proxy',
function(req, res, next) {
    // Basically make a request call to some external website and return
    // the response I get from that as my own response
    var opts = {/*json containing proper uri, mehtod and json*/}
    request(opts, function (error, responseNS, b) {
        if(error) return callback(error)
        if(!responseNS) return callback(new Error('!response'))

        return res.json(responseNS.body)
    }).pipe(res);
});

通过请求,您可以将传入的响应直接通过管道传输到文件流、其他请求或您的 api 发送到浏览器的响应。喜欢

function (req, res, next) {
    request
      .get('http://example.com/doodle.png')
      .pipe(res)    
}

与您的情况类似,只需通过管道响应即可。

app.post('/v1/something/:_id/proxy',
    function(req, res, next) {
        // Basically make a request call to some external website and return
        // the response I get from that as my own response
        var opts = {/*json containing proper uri, mehtod and json*/}
        request(opts, function (error, responseNS, b) {
            if(error) return callback(error)
            if(!responseNS) return callback(new Error('!response'))
        }).pipe(res);
    }
)