loopback-datasource-juggler
loopback-datasource-juggler copied to clipboard
loopback fails on referencesMany relation missing foreignKey in scope for nested hasMany inclusion
- say model A as a referencesMany relation with model B and model B has a hasMany relation with model C
- adding a scope in relation A>B to restrict fields in a way that 'A.id' is not included in results
- doing a GET on model A to get B relations through referencesMany, using built-in methods, and including relation B>C using filter {include:C}
loopback fails with
TypeError: Cannot read property 'toString' of undefined at KVMap.keyToString (../api_loopback/node_modules/loopback-datasource-juggler/lib/include_utils.js:64:46) at Object.KVMap.mapImpl.set (../api_loopback/node_modules/loopback-datasource-juggler/lib/include_utils.js:70:13) at Object.buildOneToOneIdentityMapWithOrigKeys (../api_loopback/node_modules/loopback-datasource-juggler/lib/include_utils.js:19:11) at includeHasManySimple (../api_loopback/node_modules/loopback-datasource-juggler/lib/include.js:498:36) at processIncludeItem (../api_loopback/node_modules/loopback-datasource-juggler/lib/include.js:275:16) at ../api_loopback/node_modules/loopback-datasource-juggler/lib/include.js:173:5 at ../api_loopback/node_modules/loopback-datasource-juggler/node_modules/async/lib/async.js:157:13 at _each (../api_loopback/node_modules/loopback-datasource-juggler/node_modules/async/lib/async.js:57:9) at Object.async.each (../api_loopback/node_modules/loopback-datasource-juggler/node_modules/async/lib/async.js:156:9) at Function.Inclusion.include (../api_loopback/node_modules/loopback-datasource-juggler/lib/include.js:172:9)
Obviously the include cannot work as i'm missing the id for relation hasMany to work, but this should be caught silently and not return the inclusion (which is actually the intent) rather than killing the server
Could easily fix this, but as there are many places to do so, i'd prefer to wait for proper guidance before submitting a fix proposal.
Eric
adding a scope in relation A>B to restrict fields in a way that 'A.id' is not included in results
I think you mean B.id is not included here right?
But anyway I reproduced it and I think a proper way to handle it is throwing an error in response body. Thought?
Same error reported here: https://github.com/strongloop/loopback-datasource-juggler/issues/890
For the track record, same error reported here: https://github.com/strongloop/loopback/issues/3233
:+1: easy way to crash server
For anyone having this issue with a mounted lb3 app inside an lb4 app, this error can happen for a model that has scope.include defined in the model definition json file.
Can probably also happen standalone.
@raymondfeng si there at least a way to catch the error so that the server doesn't crash until a fix is made?
Optimally the field would be included automatically, can be a flag on the model if it needs to be opt-in.