1

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

详细的,我有

  • 云连接器
  • 连接服务
  • 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 Cloud 系统。使用 SAP Cloud SDK for Java时时,一切都按预期工作,即我可以访问本地系统。我在本地系统上拥有足够的权限。使用基本身份验证。

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

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 标头才能使请求成功?

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

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

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>
4

2 回答 2

3

经过一番调查,位置 ID原来是导致问题的原因。它已在目标和云连接器上设置为特定值。因此,云连接器将只接受提供此属性的请求。

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

没有连接到您的子账户的 SAP Cloud Connector (SCC)。请求为子账户“SUBACCOUNT_ID”和 SCC 位置 ID 打开隧道,默认值为空字符串或根本未配置。检查 SCC 和云端的配置。

使用useOrFetchDestinationSAP Cloud SDK JavaScript 检索目标信息未返回此属性,这就是为什么从未将其添加到请求中的原因。

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

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

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

感谢丹尼斯 H 的支持。

于 2019-08-05T07:13:54.430 回答
0

更新:

老实说,我现在有点难过。鉴于您的请求适用于 Java SDK,我也对它在 JS 中失败的原因感到困惑。

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


原答案:

如果这是您使用的确切代码:

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

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

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

(但我认为这对于本地目的地来说是相当困难的),或者为当前请求的 JWT 提供目的地名称,例如:

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

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

于 2019-07-19T10:28:05.230 回答