on 11-27-2023 9:19 AM
When developing CAP CDS for Node.js I regularly had Custom Handlers in which I needed to read some part of the req.query object to make some other backend calls, sometimes I even had to modify the pre-generated queries so that they would properly work on a backend.
Let's take a look on what changed with CDS(here version 7.4.0)
As you can see, req.query.SELECT only contains a from section. Some other params like filter, limit and orderBY are not in this query object, but in Symbol(Original). -Why?
This makes developing with CAP a bit more confusing and more difficult for me.
For Example last week I had accessed a filter with req.req.query.$filter and tried to parse those filter back to CQL, so I could modify and then reattach it to the query parameters. But this doesn't seem like a good Practice
Are there new Best Practices when working with req.query in Custom Handlers using the newer CDS versions? How can I Access req.query.Symbol(Original) in my custom handlers (something like req.query.Symbol(Original) or req.query.['Symbol(Original'] doesnt work)?
Any Guidance or reference to documentation would be massively helpful.
Hi @michaelschmid03 ,
I have come across a similar kind of situation where in additional filters were required when calling S4 odata service.
For example let say we want to filter certain dataset on CompanyCode="XYZ" , you could manipulate the req.query object in this fashion
srv.on('READ','Myentity',async req=>{
const someRMtservice = await cds.connect.to('SomeRemoteService')
if(req.query.SELECT !== undefined){
const condtionLiteral = `CompanyCode='XYZ'`
//instantiate the cxn parser object
const parser= cds.parse;
// parse cxn : resultant => {xpr:[ {ref:['CompanyCode']}, '=', {val:'XYZ'} ]}
const cxnObject = parser.expr(condtionLiteral);
const cxnArray = [...cxnObject];
req.query.SELECT.where = cxnArray;
}
const data = await someRMtservice.run(req.query);
return data
})
Please also have a look at this documentation of CXN - CXN-Expression Notation .
Let me know if this works for you.
Thank you
Regards
Subramaniyam N
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
Hi @michaelschmid03 ,
There is a correction at line 11
Please find the updated code:
srv.on('READ','Myentity',async req=>{
const someRMtservice = await cds.connect.to('SomeRemoteService')
if(req.query.SELECT !== undefined){
const condtionLiteral = `CompanyCode='XYZ'`
//instantiate the cxn parser object
const parser= cds.parse;
// parse cxn : resultant => {xpr:[ {ref:['CompanyCode']}, '=', {val:'XYZ'} ]}
const cxnObject = parser.expr(condtionLiteral);
const cxnArray = [...cxnObject.xpr];
req.query.SELECT.where = cxnArray;
}
const data = await someRMtservice.run(req.query);
return data
})
HI @Subramaniyam , as you can see theres already an accepted Solution to this Issue. And your Answer doesnt solve this since we were talking about Reading and not Modifying Filters.
Im also totally aware of how to modify Querys. But if we talk about this i Think, that your approach is actually less Readable and more complex than it has to be. Since parsing is handled automatically before query Excecution, you should be able to just push your own Filterin a more readble object literal or string format to the .where of said req.query object
Best Regards,
Michael
User | Count |
---|---|
80 | |
9 | |
9 | |
7 | |
7 | |
6 | |
6 | |
6 | |
5 | |
4 |
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.