![](/img/trans.png)
[英]How to send real time stream response from server to client using Node.js express
[英]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 錯誤(例如400
、 404
),但它可以工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.