我正在尝试使用SAP Cloud SDK for JavaScript (版本1.5.0)通过Cloud Connector和SAP Cloud Platform连接服务访问Premise系统上的S / 4HANA。
详细,我有
它们都按预期工作。这些先决条件由不同的教程(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)
答案 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
})
如果这不是您正在使用的代码,能否请您提供更具代表性的代码段以及该错误的完整堆栈跟踪记录?