无法使用 SAP Cloud SDK for JavaScript 通过 Cloud Connector 访问 S/4HANA on Premise 系统

Cannot access S/4HANA on Premise system via Cloud Connector using SAP Cloud SDK for JavaScript

我正在尝试使用 SAP Cloud SDK for JavaScript[=45 通过 Cloud Connector 和 SAP Cloud Platform 连接服务访问 S/4HANA on Premise 系统=](版本 1.5.0)。

详细的,我有

  • 云连接器
  • 连接服务
  • xsuaa 服务实例
  • 应用程序路由器 (app-router)
  • 目的地
  • 目的地服务

一切都按预期工作。这些先决条件由不同的教程解释 (https://blogs.sap.com/2019/04/02/a-do-it-yourself-at-home-guide-how-to-connect-a-node.js-app-on-sap-cloud-platform-for-the-cloud-foundry-to-an-s4hana-on-premise-system-securely-via-cloud-connector/, https://blogs.sap.com/2017/07/13/part-2-how-to-use-the-sap-cloud-platform-connectivity-and-the-cloud-connector-in-the-cloud-foundry-environment/)。

使用此设置,我可以轻松访问 S/4HANA 云系统。 当使用 Java 的 SAP Cloud SDK 时,一切都按预期工作,即我可以访问内部部署系统。我在本地系统上拥有足够的权限。使用基本身份验证。

使用 SAP Cloud SDK 检索文档信息记录的 GET 请求示例 Java脚本:

let destination = await useOrFetchDestination({
destinationName: 'MY_DESTINATION',
jwt: 'MY_JWT' });
DocumentInfoRecord.requestBuilder()
.getAll()
.execute(destination);

但是针对本地系统进行测试会使 GET 请求失败,状态代码为 503:

ERR Error: get request failed!
ERR     at Object.errorWithCause (/path-to-app/node_modules/@sap/cloud-sdk-util/dist/error.js:14:20)
ERR     at specializeError (/path-to-app/@sap/cloud-sdk-core/dist/request-builder/request/odata-request.js:175:32)
ERR     at /path-to-app/@sap/cloud-sdk-core/dist/request-builder/request/odata-request.js:162:58
ERR     at processTicksAndRejections (internal/process/task_queues.js:86:5)
ERR Caused by:
ERR Error: Request failed with status code 503
ERR     at createError (/path-to-app/axios/lib/core/createError.js:16:15)
ERR     at settle (/path-to-app/axios/lib/core/settle.js:17:12)
ERR     at IncomingMessage.handleStreamEnd (/path-to-app/axios/lib/adapters/http.js:237:11)
ERR     at IncomingMessage.emit (events.js:198:15)
ERR     at endReadableNT (_stream_readable.js:1139:12)
ERR     at processTicksAndRejections (internal/process/task_queues.js:81:17)

我可能错过了什么?是否需要额外的 HTTP headers 才能使请求成功?

更新:将目标信息添加到代码段并完成错误消息。

第二次更新:目标配置类似于:

Name: <MY_DESTINATION>
Type: HTTP
URL: http://...    //this matches the cloud connector host, i.e. in SAP Cloud Platform Cockpit --> Cloud Connectors --> Exposed Back-End Systems
ProxyType: OnPremise
Authentication: BasicAuthentication
User: <USERNAME>
Password: <PASSWORD>

更新:

老实说,我现在有点不知所措。鉴于您的请求适用于 Java SDK,我也很困惑为什么它在 JS 中失败。

您是否尝试过在 Java 中查询完全相同的服务? (即您确定云连接器中的路径映射正常工作吗?) 你能从云驾驶舱分享你的目标配置吗? 除了您已经发布的错误之外,是否还有其他日志输出? 您有权访问云连接器日志吗? (也就是说,你能以某种方式找出请求失败的地方吗?


原回答:

如果这正是您使用的代码:

DocumentInfoRecord.requestBuilder()
  .getAll()
  .execute({});

那么请求无论如何都不会工作,因为您没有为 execute 函数提供正确的目的地。您需要传递目的地本身,例如:

.execute({
  url: 'https://my.onprem.system',
  ...
})

(但我想这对于 on-prem 目的地来说相当困难),或者提供一个目的地名称,即当前请求的 JWT,例如:

.execute({
  destinationName: 'my-on-prem-destination',
  jwt: myJwt
})

如果这不是您使用的代码,能否请您提供更具代表性的代码片段和错误的完整堆栈跟踪?

经过一些调查,位置 ID 导致了问题。它已在目标和云连接器上设置为特定值。 因此,云连接器将只接受提供此 属性.

的请求

云连接器的日志中没有错误。但是远程调试应用程序(按照 these 说明)出现了这个错误消息:

There is no SAP Cloud Connector (SCC) connected to your subaccount. Requested opening of a tunnel for subaccount "SUBACCOUNT_ID" and SCC location ID, with default value, that is empty string or simply not configured. Check the configuration on SCC and cloud side.

使用 SAP Cloud SDK JavaScript 中的 useOrFetchDestination 检索目的地信息没有 return 这个 属性 这就是为什么它从未被添加到请求中的原因。

当前的解决方法是从目标和云连接器中删除位置 ID。然后请求成功。

有没有办法检索目的地的位置 ID?

更新: 可以使用 originalProperties 属性 从目的地检索位置 ID。如果存在,它包含名为 CloudConnectorLocationId 的 属性。如上所述 here 可以将此值作为 SAP-Connectivity-SCC-Location_ID header 添加到请求中。

感谢 Dennis H 的支持。