我从Node.js调用了一个API,它会在响应正文中产生PNG数据,我得到的是编码格式的响应(见下图):

enter image description here

现在,我需要在我的API中发送此PNG图像作为响应.

我可以用以下代码片段保存图像:

const writer = fs.createWriteStream("testimage.png");

        const streamResponse = await axios({
          'method': 'GET',
          responseType: 'stream',
          'url': endPoint + requestRoute,
          'headers': {
            'Authorization': 'Bearer ' + _token 
          }
        });

        streamResponse.data.pipe(writer);

但是我不想把图片保存在我的服务器上,我想把从外部API收到的图片作为我的API的响应发送出go .

例如:

Api.getPNGImage = async function (_request, _respsonse) {

    var options = {
        'method': 'GET',
        'url': endPoint + requestRoute,

        'headers': {
            'content-type': 'application/json',
            'Authorization': 'Bearer ' + _token
         }
};
 request(options, function (error, response) {
        let image = response.body;
        _respsonse.send(image)
    });
}

我try 了下面的方法,但Base64无效: let str = "data:" + 'image/png' + ";base64," + Buffer.from(_responses.body).toString('base64');

推荐答案

您可以直接将流响应通过管道发送到客户端响应.这种方法不需要将图像保存在服务器上,并允许您将图像数据直接转发到客户端.

  1. 确保在响应中设置正确的Content-Type标头,以通知客户端它正在接收图像.

  2. 使用stream.pipeline方法处理从外部API到客户端响应的数据流.此方法自动处理资源清理和错误处理.


const axios = require('axios');
const express = require('express');
const app = express();
const stream = require('stream');

app.get('/your-route', async (req, res) => {
    try {
        const streamResponse = await axios({
            method: 'GET',
            responseType: 'stream',
            url: endPoint + requestRoute,,
            headers: {
                'Authorization': 'Bearer ' + _token 
            }
        });

        // Set the Content-Type header to image/png
        res.setHeader('Content-Type', 'image/png');

        // Use stream.pipeline to handle the streaming of data
        await stream.pipeline(
            streamResponse.data,
            res,
            (err) => {
                if (err) {
                    console.error('Pipeline failed.', err);
                    res.status(500).send('Streaming failed.');
                }
            }
        );
    } catch (error) {
        console.error('Request to external API failed.', error);
        res.status(500).send('Request to external API failed.');
    }
});

app.listen(3000, () => {
    console.log('Server is running on port 3000');
});


Javascript相关问答推荐

Express.js:使用Passport.js实现基于角色的身份验证时出现太多重定向问题

RxJS setTimeout操作符等效

Vega中的模运算符

从实时数据库(Firebase)上的子类别读取数据

如何将连续的十六进制字符串拆分为以空间分隔的十六进制块,每个十六进制块包含32个二元组?

在网页上添加谷歌亵渎词

Google maps API通过API返回ZERO_RESULTS,以获得方向请求,但适用于Google maps

cypress中e2e测试上的Click()事件在Switch Element Plus组件上使用时不起作用

如何使onPaste事件与可拖动的HTML元素一起工作?

如何强制Sphinx中的自定义js/css文件始终加载更改而不缓存?

有条件重定向到移动子域

如何在Node.js中排除导出的JS文件

TypeError:无法读取未定义的属性(正在读取';宽度';)

使用自动识别发出信号(&Q)

Node.js错误: node 不可单击或不是元素

是否可以在不更改组件标识的情况下换出Reaction组件定义(以维护状态/引用等)?如果是这样的话,是如何做到的呢?

如何在Jest中模拟函数

为什么NULL不能在构造函数的.Prototype中工作

react :图表负片区域不同 colored颜色

使用Java脚本筛选数组中最接近值最小的所有项