如何通过`tx.get`从REST服务中加载png 相当于`fs.readFile`

2020-08-18 00:08发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


在我简单的CAP应用程序中,我想从第三方REST服务加载PNG文件并将其流式传输到FE应用程序。

这不应该涉及数据库。

应用程序中的最终要求是从第三方服务加载并显示动态生成的一次性qrcode。

这是我的代码示例。 请注意" image-service.js"文件,在该文件中,我有一个测试实现,可以从文件系统中读取png,这是工作示例。 无法从第三方REST服务加载png的目标行为。

我需要如何更改代码才能使其正常工作?

#srv/image-service.cds

 使用" ../db/data-model"中的{Media};
 服务流{
     实体图像作为在媒体上的投影;
 } 
#db/data-model.cds

 实体媒体{
     密钥ID:整数;
     @ Core.MediaType:mediaType内容:LargeBinary;
     @ Core.IsMediaType:true mediaType:字符串;
 } 
#package.json

 " cds":{
     "要求":{
       "媒体":{
         " kind":"休息",
         "凭据":{
           " url":" https://upload.wikimedia.org/"
         }
       }
 ... 
#srv/image-service.js

 const fs = require(" fs")。promises
 const {Readable} = require(" stream")
 module.exports =(srv)=> {
     srv.on(" READ"," Image",async(req)=> {
         const srv = cds.connect.to(" media");
         const tx = srv.transaction(req);

        //#1-不起作用的示例-从Web服务加载png的变体
        //这是目标行为
         const pngBuffer等待tx.get(`/wikipedia/commons/d/d9/Test.png`);

        //#2-工作示例-从文件系统加载
         const pngBuffer =等待fs.readFile(`$ {__ dirname}/Test.png`);

         const visibleStream = new Readable();
         const result = new Array();
         visibleStream.push(pngBuffer);
         可读Stream.push(null);
         result.push({value:可读Stream});
         返回结果;
     })
 }
 

谢谢

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


在我简单的CAP应用程序中,我想从第三方REST服务加载PNG文件并将其流式传输到FE应用程序。

这不应该涉及数据库。

应用程序中的最终要求是从第三方服务加载并显示动态生成的一次性qrcode。

这是我的代码示例。 请注意" image-service.js"文件,在该文件中,我有一个测试实现,可以从文件系统中读取png,这是工作示例。 无法从第三方REST服务加载png的目标行为。

我需要如何更改代码才能使其正常工作?

#srv/image-service.cds

 使用" ../db/data-model"中的{Media};
 服务流{
     实体图像作为在媒体上的投影;
 } 
#db/data-model.cds

 实体媒体{
     密钥ID:整数;
     @ Core.MediaType:mediaType内容:LargeBinary;
     @ Core.IsMediaType:true mediaType:字符串;
 } 
#package.json

 " cds":{
     "要求":{
       "媒体":{
         " kind":"休息",
         "凭据":{
           " url":" https://upload.wikimedia.org/"
         }
       }
 ... 
#srv/image-service.js

 const fs = require(" fs")。promises
 const {Readable} = require(" stream")
 module.exports =(srv)=> {
     srv.on(" READ"," Image",async(req)=> {
         const srv = cds.connect.to(" media");
         const tx = srv.transaction(req);

        //#1-不起作用的示例-从Web服务加载png的变体
        //这是目标行为
         const pngBuffer等待tx.get(`/wikipedia/commons/d/d9/Test.png`);

        //#2-工作示例-从文件系统加载
         const pngBuffer =等待fs.readFile(`$ {__ dirname}/Test.png`);

         const visibleStream = new Readable();
         const result = new Array();
         visibleStream.push(pngBuffer);
         可读Stream.push(null);
         result.push({value:可读Stream});
         返回结果;
     })
 }
 

谢谢

付费偷看设置
发送
2条回答
半个程序猿
1楼-- · 2020-08-18 00:27

多米尼克,你好

尚不支持从外部服务流式传输。

您可以尝试像当前使用tx.get一样读取数据,然后在自定义处理程序中将字符串转换为Buffer。

最诚挚的问候,

Johannes

木偶小白
2楼-- · 2020-08-18 00:31

通过使用基础axios程序包请求PNG文件解决。

 srv.on(" READ"," Image",async(req)=> {
     const srv = cds.connect.to(" media");

    //tx.get不支持responseType:流,因此我们使用基础axios包进行请求,但从package.json中维护的`srv`对象获取url
     const response = await axios({
       方法:"获取",
       网址:`$ {srv.kind.messaging.credentials.url}/wikipedia/commons/d/d9/Test.png`,
       responseType:"流",
     });

    //缓冲块
     const chunks = [];
     等待中(让一部分response.data){
       chunks.push(chunk);
     }
     let buffer = Buffer.concat(chunks);

    //创建可读
     const visibleStream = new Readable();
     const result = new Array();
     visibleStream.push(buffer);
    //结束流
     可读Stream.push(null);
     result.push({value:可读Stream});

     返回结果;
   });

 

一周热门 更多>