无法使用适用于JavaScript的SAP Cloud SDK通过Cloud Connector在Premise系统上访问S / 4HANA

时间:2019-07-19 10:06:06

标签: javascript typescript sap-cloud-sdk

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

详细,我有

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

它们都按预期工作。这些先决条件由不同的教程(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用于 Java 时,一切都会按预期运行,即,我可以访问内部系统。我对本地系统具有足够的权限。使用基本身份验证。

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

select  bk.booking_id,
        bk.booking_type,
        btaxi.booking_date
from booking bk
inner join booking_taxi btaxi on btaxi.booking_id = bk.booking_id and bk.booking_type = 2
union all
select  bk.booking_id,
        bk.booking_type,
        bbus.booking_date
from booking bk
inner join booking_bus bbus on bbus.booking_id = bk.booking_id and bk.booking_type = 3;

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

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

我可能错过了什么?要使请求成功,是否需要其他HTTP标头?

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

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

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)

2 个答案:

答案 0 :(得分:2)

经过调查,结果发现位置ID 导致了该问题。在目标和云连接器上已将其设置为特定值。 因此,云连接器将仅接受提供此属性的请求。

云连接器的日志中没有错误。但是远程调试应用程序(遵循these指令)却显示以下错误消息:

  

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

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

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

是否可以检索目的地的位置ID?

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

感谢Dennis H的支持。

答案 1 :(得分: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
})

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