【问题标题】:Is it possible to stream a response from a different server with Node.js?是否可以使用 Node.js 流式传输来自不同服务器的响应?
【发布时间】:2020-11-16 23:52:07
【问题描述】:

首先,如果标题描述性不够,请道歉。

这是我必须使用的设置:

Internet          DMZ         Firewall         LAN
========          ===         ========         ===
                                 :
clients* -------> App -----------:-----------> API
                                 :

clients 通过公共 URL 访问App,此App 然后访问内部API 服务器并代理来自客户端的请求。客户端有权访问内部API 服务器,因为它的接口不能暴露在防火墙之外。

App 是一款小巧的 Meteor 应用程序。 API 是一个更大的应用程序,也使用 Node.js。 App 需要从 API 请求一个文件(很高兴地提供服务)并将流代理回客户端。

如何将响应从API 通过 App 流式传输到客户端?

这是我目前在 Meteor 应用上的路线图:

import connectRoute from 'connect-route';
import fetch from 'node-fetch';
    
WebApp.connectHandlers.use(connectRoute(router => {

   router.get('/pdf/:hash', async (req, res, next) => {
      const { hash } = req.params;

      // debug
      res.writeHead(200);
      res.end(`Requested file hash: ${hash}`);

      // TODO : proxy response headers back to client
      // const response = await fetch(`http://api.domain.local/files/${hash}`);
   });

}));

我不知道如何处理response

【问题讨论】:

    标签: node.js meteor fetch


    【解决方案1】:

    找到我自己的解决方案:

    WebApp.connectHandlers.use(connectRoute(router => {
    
       router.get('/pdf/:hash', async (req, res, next) => {
          const { hash } = req.params;
    
          try {
             const response = await fetch(`${API_ROOT}/files/${hash}/`);
    
             res.setHeader('content-disposition', response.headers.get('content-disposition') );
             res.setHeader('content-type', response.headers.get('content-type'));
             response.body.pipe(res);
          } catch (e) {
             res.writeHead(500);
          }
       });
    
    }));
    

    它不完整,因为它不处理各种 HTTP 错误(例如400404),但它可以工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-15
      • 1970-01-01
      • 2018-09-04
      • 2020-03-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多