通过SAP Cloud SDK for JavaScript API将请求发送到CAP API

2020-08-21 19:33发布

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

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


大家好,

一切正常。 从那里,我成功创建了一个单独的项目以使用Bookshop服务。 在其中,我使用" sap-cloud-sdk generate-odata-client"命令基于该服务创建了一个OData客户端。 我在" service-mapping.json"内部将服务路径设置为"/img/browse",然后为该服务重写了odata-client。

从那里,我想定义一个API端点以从服务中获取所有订单。 这就是我的Cloud SDK API的orders.service.ts。 然后,当然,控制器会使用该服务功能,该功能会将功能路由到GET请求的"/img/books"。

从'@ nestjs/common'导入{可注入};
 从" odata-client/catalog-service"导入{Books};

 const serviceLink:字符串='http://localhost:4004'

 @Injectable()
 导出类BooksService {
    
     异步getAllBooks(){
         const books = await Books.requestBuilder()
             。得到所有()
             .execute({url:serviceLink});

         console.log(books);

         还书;
     }
 }
 

无论如何,请求构建器都会创建HTTP请求'GET/browse/Books?$ format = json',该请求会在Postman中返回正确的结果,但在SDK中不起作用。 CAP API的控制台识别出已发送获取请求,但是SDK API给出错误"无法读取未定义的属性"结果"。 为了使这两个API相互连接,是否需要添加任何额外的样板文件?

SAP社区在解决这类问题方面非常有帮助,对此我深表感谢! 谢谢!

编辑:更多详细信息

这是图书管理员的样子:

 import从'@ nestjs/common'导入{Controller,Get};
 从" ./books.service"导入{BooksService};

 @Controller('books')
 导出类BooksController {
     构造函数(私有readonly booksService:BooksService){}

     @得到()
     getAllBooks(){
         返回this.booksService.getAllBooks()
     }
 }
 

这将导入到其对应的模块中,并由app模块使用。 因此,我最终要向" http://localhost:3000/books"发出GET请求。

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

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


大家好,

一切正常。 从那里,我成功创建了一个单独的项目以使用Bookshop服务。 在其中,我使用" sap-cloud-sdk generate-odata-client"命令基于该服务创建了一个OData客户端。 我在" service-mapping.json"内部将服务路径设置为"/img/browse",然后为该服务重写了odata-client。

从那里,我想定义一个API端点以从服务中获取所有订单。 这就是我的Cloud SDK API的orders.service.ts。 然后,当然,控制器会使用该服务功能,该功能会将功能路由到GET请求的"/img/books"。

从'@ nestjs/common'导入{可注入};
 从" odata-client/catalog-service"导入{Books};

 const serviceLink:字符串='http://localhost:4004'

 @Injectable()
 导出类BooksService {
    
     异步getAllBooks(){
         const books = await Books.requestBuilder()
             。得到所有()
             .execute({url:serviceLink});

         console.log(books);

         还书;
     }
 }
 

无论如何,请求构建器都会创建HTTP请求'GET/browse/Books?$ format = json',该请求会在Postman中返回正确的结果,但在SDK中不起作用。 CAP API的控制台识别出已发送获取请求,但是SDK API给出错误"无法读取未定义的属性"结果"。 为了使这两个API相互连接,是否需要添加任何额外的样板文件?

SAP社区在解决这类问题方面非常有帮助,对此我深表感谢! 谢谢!

编辑:更多详细信息

这是图书管理员的样子:

 import从'@ nestjs/common'导入{Controller,Get};
 从" ./books.service"导入{BooksService};

 @Controller('books')
 导出类BooksController {
     构造函数(私有readonly booksService:BooksService){}

     @得到()
     getAllBooks(){
         返回this.booksService.getAllBooks()
     }
 }
 

这将导入到其对应的模块中,并由app模块使用。 因此,我最终要向" http://localhost:3000/books"发出GET请求。

付费偷看设置
发送
5条回答
我是小鹏鹏啊
1楼 · 2020-08-21 19:39.采纳回答

感谢@dhem,他说CAP需要一个OData v2适配器才能接收来自Cloud SDK API的请求。 我在OData v2适配器的存储库中阅读了自述文件:

https: //github.com/gregorwolf/SAP-NPM-API-collection/tree/master/apis/cds-odata-v2-adapter-proxy

仅对说明进行总结,请在现有CAP项目中运行命令:

 npm install @ sap/cds-odata-v2-adapter-proxy -s 

完成后,在" srv"文件夹中添加一个" server.js",并向其中添加以下代码:

"使用严格";

 const cds = require(" @ sap/cds");
 const proxy = require(" @ sap/cds-odata-v2-adapter-proxy");

 cds.on(" bootstrap",app => app.use(proxy()));

 module.exports = cds.server; 

再次运行项目后,请在服务路径前添加"/img/v2"。 对于OData客户端生成,需要对service-mapping.json执行相同的操作。 重新生成OData客户端并再次运行项目后,它应该可以正常工作。

zhangjiyang1323
2楼-- · 2020-08-21 19:41

我打印了错误的堆栈,结果是:

 TypeError:无法读取未定义的属性"结果"
 在
 C:\ Workspace \ cds-started \ bookshop-nest \ node_modules \ @sap \ cloud-sdk-core \ dist \ request-builder \ get-all-request-builder.js:155:76
 在processTicksAndRejections(内部/进程/task_queues.js:94:5)
 在异步BooksService.getAllBooks
 (C:\ Workspace \ cds-get-started \ bookshop-nest \ dist \ src\ modules \ books \ books.service.js:14:23)
 在异步C:\ Workspace \ cds-get-started \ bookshop-nest \ node_modules \ @nestjs \ core \ router \ router-execution-context.js:45:28
 在异步C:\ Workspace \ cds-get-started \ bookshop-nest \ node_modules \ @nestjs \ core \ router \ router-proxy.js:8:17 

SDK应该可以正常工作。 就像我只是写一个通用的get处理程序说"你好"一样,它绝对可以正常工作。 SDK正在调用CAP OData服务,以便最终从该服务获取信息。

哎,真难
3楼-- · 2020-08-21 19:49

我怀疑可能是什么问题。 我认为CAP默认使用v4协议公开OData服务,而生成器现在仅支持v2。 这可以解释为什么在处理200响应期间会引发错误。 CAP提供了将v4转换为v2的协议适配器,您可以尝试将其添加到服务中。 另外,您能否分享来自邮递员的CAP服务回复? 这应该有助于检查我的怀疑是否正确。

clever101
4楼-- · 2020-08-21 19:57

谢谢丹尼斯,

您获得了巨大的帮助! 这是SDK的响应:

 {
     " statusCode":500,
     " message":"内部服务器错误"
 } 

因此,现在,我将了解如何将v2适配器注入CAPM项目。 我会告诉您是否可行

SC_Yao
5楼-- · 2020-08-21 19:57

很高兴看到这种方法有效!

一周热门 更多>