cds.ql.UPDATE中的错误? 无法使更新在@ sap/cds @ 3.7.1中工作

2020-09-09 07:28发布

点击此处---> 群内免费提供SAP练习系统(在群公告中)加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)嗨, 我正在尝试使用sap/c...

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

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


嗨,

我正在尝试使用sap/cds来构建应用程序。 cds.ql.UPDATE方法似乎不起作用,或者我错过了应如何使用它。

我已在以" cds init"开头的最小项目上复制了该问题。 您可以在 https://github.com/jumpifzero/sap上克隆此项目。 -cloud-cap-cds-update-bug

要复制该问题:

1)启动" cds repl"。 (问题不仅仅限于代表)

2)让我们插入"书籍",然后尝试对其进行更新。 执行以下repl命令:

 cds.connect()//等待完成
 令e = cds.entities(" my.bookshop")
//插入书籍
 cds.run(cds.ql.INSERT.into(e.Books).columns('ID','title','stock')。values('42','title',10))
//尝试更新标题
 cds.run(cds.ql.UPDATE(e.Books).set({title:'new title'})。where({ID:42}))
 

最后一次更新将产生以下错误。 在我对文档的理解中,不应该。

 {IllegalFunctionArgumentError:错误的函数参数:值
     在Update.set(D:\ tiago \ projects \ cds-update-bug \ node_modules \ @sap \ cds-ql \ lib \ statements \ Update.js:30:13)
     在Update.set(D:\ tiago \ projects \ cds-update-bug \ node_modules \ @sap \ cds \ lib \ runtime \ ql.js:205:60)名称:'IllegalFunctionArgumentError'}
 

如果我们转到引发异常的代码,则会看到以下内容:

 set(valueObject){
     如果(this._isInvalidValueObject(valueObject)){
       抛出新的IllegalFunctionArgumentError('values')
     }
 

因此_isInvalidValueObject函数似乎已损坏,或者我们传递了错误的信息。 该函数如下所示:

 _isInvalidValueObject(valueObject){
     if(!(valueObject instanceof Object)|| Array.isArray(valueObject)){
       返回真
     }
 ... 

通过调试,我看到" valueObject instanceof Object"实际上返回false,因此整个方法返回true,并引发异常。 放置一些调用记录并重新运行此代码:

 _isInvalidValueObject(valueObject){
     if(!(valueObject instanceof Object)|| Array.isArray(valueObject)){
       console.log(`instanceof Object?$ {valueObject instanceof Object}`);
       console.log(`JSON.stringify(obj)= $ {JSON.stringify(valueObject)}`);
       console.log(`constructor name = $ {valueObject.constructor.name}`);
       返回真
     }

 

我们得到了:

> cds.run(cds.ql.UPDATE(e.Books).set({title:'new title'})。where({ID:42}))
 对象的instanceof? 假
 JSON.stringify(obj)= {" title":"新标题"}
 构造函数名称=对象
 {IllegalFunctionArgumentError:函数参数不正确:值
     在Update.set(D:\ tiago \ projects \ cds-update-bug \ node_modules \ @sap \ cds-ql \ lib \ statements \ Update.js:30:13)
     在Update.set(D:\ tiago \ projects \ cds-update-bug \ node_modules \ @sap \ cds \ lib \ runtime \ ql.js:205:60)名称:'IllegalFunctionArgumentError'}
 

在我看来,valueObject是传入内容的包装版本,这破坏了instanceof检查。 这是一个已知的问题? 有什么解决方法,还是我们使用这种方法不正确?

目前我们只是在修补此方法,使它返回false,这使UPDATE成功,但这是一个可怕的技巧:)

非常感谢任何指针!

2条回答
哎,真难
2020-09-09 07:47 .采纳回答

非常感谢Tiago的详细分析(以及 cds repl 的大量使用:)

表示`instanceof`检查范围太窄。 我们将修复该问题; 用一个不太积极的测试来代替它,例如`typeof x ==='object'`→资金补丁可以这样做,直到我们的解决方案出来。

_____

主题外:这是我对上面的REPL代码段的偏好:

 cds.connect()//等待完成
 const {Books} = cds.entities(" my.bookshop")
 cds.run(INSERT({ID:42,title:'title',stock:10})。into(Books))
 cds.run(UPDATE(Books).set({title:'new title'})。where({ID:42}))
 

一周热门 更多>