流响应到HTTP响应

log*_*ins 4 stream node.js express

我有一个API试图向一个API发送HTTP请求,然后将流和图像传回给我,然后将该图像流回客户端向我发送请求或等到图像流式传输给我并发送一下子就这样.

我正在使用Express和请求承诺.

这是我的代码的缩短版本.

const express = require('express');
const router = express.Router();
const request = require('request-promise');

const imgFunc = async () => {
  try {
    const response = await request.get({
      method: 'GET',
      uri: `http://localhost:8080`,
    });
    return response;
  } catch(err) {
    console.log(err);
  }
};

router.get('/', async function(req, res, next) {
  try {
    const response = await imgFunc();
    return res.send(response);
  } catch (err) {
    console.log(err);
  }
});

module.exports = router;
Run Code Online (Sandbox Code Playgroud)

我得到的图像正是我所假设的二进制数据,我不知道是否需要在请求 - 承诺级别做一些事情才能做到这一点或者当我将其发送回客户端时.

我在localhost运行的服务器:8080模仿了我将要完成的实际服务器.

ski*_*tle 11

您可以直接管道流而不是使用request-promise.

const express = require('express');
const router = express.Router();
const https = require('https');

router.get('/', function(req, res) {
    const url = 'https://www.gravatar.com/avatar/2ea70f0c2a432ffbb9e5875039645b39?s=32&d=identicon&r=PG&f=1';

    const request = https.get(url, function(response) {
        const contentType = response.headers['content-type'];

        console.log(contentType);

        res.setHeader('Content-Type', contentType);

        response.pipe(res);
    });

    request.on('error', function(e){
        console.error(e);
    });
});

module.exports = router;
Run Code Online (Sandbox Code Playgroud)

或者使用基于的requestrequest-promise:

const express = require('express');
const router = express.Router();
const request = require('request');

router.get('/', function(req, res) {
    const url = 'https://www.gravatar.com/avatar/2ea70f0c2a432ffbb9e5875039645b39?s=32&d=identicon&r=PG&f=1';

    request.get(url).pipe(res);
});

module.exports = router;
Run Code Online (Sandbox Code Playgroud)