簡體   English   中英

是否可以使用 Node.js 從不同的服務器流式傳輸響應?

[英]Is it possible to stream a response from a different server with Node.js?

首先,如果標題不夠描述,請見諒。

這是我必須使用的設置:

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

clients訪問App通過公開網址,這個App然后訪問內部API服務器和代理服務器從客戶端請求。 客戶端無權訪問內部API服務器,因為它的接口不能暴露在防火牆之外。

App是一個小巧的 Meteor 應用程序。 API是一個更大的應用程序,也使用 Node.js。 App需要從API請求一個文件(它被愉快地提供)並將流代理回客戶端。

如何將響應從API通過App流式傳輸到客戶端?

這是迄今為止我在 Meteor 應用程序上的路線 squeleton:

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

找到了我自己的解決方案:

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 ),但它可以工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM