点击此处---> 群内免费提供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成功,但这是一个可怕的技巧:)
非常感谢任何指针!
非常感谢Tiago的详细分析(以及 cds repl 的大量使用:)
表示`instanceof`检查范围太窄。 我们将修复该问题; 用一个不太积极的测试来代替它,例如`typeof x ==='object'`→资金补丁可以这样做,直到我们的解决方案出来。
_____
主题外:这是我对上面的REPL代码段的偏好:
感谢Daniel的快速周转。 好东西!
期待修复程序的发布。
此致
Tiago
一周热门 更多>