loopback-datasource-juggler icon indicating copy to clipboard operation
loopback-datasource-juggler copied to clipboard

loopback fails on referencesMany relation missing foreignKey in scope for nested hasMany inclusion

Open ebarault opened this issue 10 years ago • 6 comments

  1. say model A as a referencesMany relation with model B and model B has a hasMany relation with model C
  2. adding a scope in relation A>B to restrict fields in a way that 'A.id' is not included in results
  3. 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

ebarault avatar Nov 30 '15 08:11 ebarault

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?

jannyHou avatar Jun 03 '16 22:06 jannyHou

Same error reported here: https://github.com/strongloop/loopback-datasource-juggler/issues/890

jannyHou avatar Aug 12 '16 03:08 jannyHou

For the track record, same error reported here: https://github.com/strongloop/loopback/issues/3233

ebarault avatar Mar 01 '17 10:03 ebarault

:+1: easy way to crash server

luxigo avatar Oct 10 '17 08:10 luxigo

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.

bostjanpisler avatar Mar 20 '22 09:03 bostjanpisler

@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.

bostjanpisler avatar Mar 24 '22 14:03 bostjanpisler