loopbackio / loopbackio/loopback-datasource-juggler

Model errors when using relations with the MongoDB connector cause crashes

Abierto
#111 11 comentarios 0 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

bug help wanted major needs-reproduction
Lenguaje dominante
JavaScript
Estrellas
282
Forks
366
Merge medio
17 h 4 min
PR fusionados (30 d)
10

Descripción

I have relations setup with a model which includes a property similar to this:

```
versions: [
{
id: String
}
]
```

If the `versions` property is actually an object, rather than an array (due to an error in saving), loopback crashes when it attempts to resolve relations involving this model.

This is the error I get:

```
/Users/zackbloom/s/API/node_modules/mongodb/lib/mongodb/connection/base.js:245
throw message;
^
Error: Items must be an array: [object Object]
at new List (/Users/zackbloom/s/API/node_modules/loopback-datasource-juggler/lib/list.js:25:11)
at /Users/zackbloom/s/API/node_modules/loopback-datasource-juggler/lib/model.js:178:39
at Array.forEach (native)
at Function.ModelClass.forEachProperty (/Users/zackbloom/s/API/node_modules/loopback-datasource-juggler/lib/model-builder.js:271:51)
at ModelConstructor.ModelBaseClass._initProperties (/Users/zackbloom/s/API/node_modules/loopback-datasource-juggler/lib/model.js:164:8)
at /Users/zackbloom/s/API/node_modules/loopback-datasource-juggler/lib/dao.js:557:13
at Array.forEach (native)
at /Users/zackbloom/s/API/node_modules/loopback-datasource-juggler/lib/dao.js:554:12
at /Users/zackbloom/s/API/node_modules/loopback-datasource-juggler/lib/include.js:59:11
at /Users/zackbloom/s/API/node_modules/loopback-datasource-juggler/node_modules/async/lib/async.js:113:21
at /Users/zackbloom/s/API/node_modules/loopback-datasource-juggler/node_modules/async/lib/async.js:24:16
at /Users/zackbloom/s/API/node_modules/loopback-datasource-juggler/lib/include.js:124:9
at /Users/zackbloom/s/API/node_modules/loopback-datasource-juggler/node_modules/async/lib/async.js:111:13
at Array.forEach (native)
at _each (/Users/zackbloom/s/API/node_modules/loopback-datasource-juggler/node_modules/async/lib/async.js:32:24)
at Object.async.each (/Users/zackbloom/s/API/node_modules/loopback-datasource-juggler/node_modules/async/lib/async.js:110:9)
at processIncludeItem (/Users/zackbloom/s/API/node_modules/loopback-datasource-juggler/lib/include.js:106:11)
at /Users/zackbloom/s/API/node_modules/loopback-datasource-juggler/lib/include.js:57:5
at /Users/zackbloom/s/API/node_modules/loopback-datasource-juggler/node_modules/async/lib/async.js:111:13
at Array.forEach (native)
at _each (/Users/zackbloom/s/API/node_modules/loopback-datasource-juggler/node_modules/async/lib/async.js:32:24)
at Object.async.each (/Users/zackbloom/s/API/node_modules/loopback-datasource-juggler/node_modules/async/lib/async.js:110:9)
at Function.Inclusion.include (/Users/zackbloom/s/API/node_modules/loopback-datasource-juggler/lib/include.js:56:9)
at Function.f (/Users/zackbloom/s/API/node_modules/loopback-datasource-juggler/lib/jutil.js:100:15)
at Function.f [as include] (/Users/zackbloom/s/API/node_modules/loopback-datasource-juggler/lib/jutil.js:100:15)
at /Users/zackbloom/s/API/node_modules/loopback-connector-mongodb/lib/mongodb.js:519:33
at /Users/zackbloom/s/API/node_modules/mongodb/lib/mongodb/cursor.js:163:16
at commandHandler (/Users/zackbloom/s/API/node_modules/mongodb/lib/mongodb/cursor.js:709:16)
at /Users/zackbloom/s/API/node_modules/mongodb/lib/mongodb/db.js:1846:9
at Server.Base._callHandler (/Users/zackbloom/s/API/node_modules/mongodb/lib/mongodb/connection/base.js:445:41)
at /Users/zackbloom/s/API/node_modules/mongodb/lib/mongodb/connection/server.js:468:18
at [object Object].MongoReply.parseBody (/Users/zackbloom/s/API/node_modules/mongodb/lib/mongodb/responses/mongo_reply.js:68:5)
at [object Object]. (/Users/zackbloom/s/API/node_modules/mongodb/lib/mongodb/connection/server.js:426:20)
at [object Object].EventEmitter.emit (events.js:95:17)
at [object Object]. (/Users/zackbloom/s/API/node_modules/mongodb/lib/mongodb/connection/connection_pool.js:201:13)
at [object Object].EventEmitter.emit (events.js:98:17)
at Socket. (/Users/zackbloom/s/API/node_modules/mongodb/lib/mongodb/connection/connection.js:339:18)
at Socket.EventEmitter.emit (events.js:95:17)
at Socket. (_stream_readable.js:746:14)
at Socket.EventEmitter.emit (events.js:92:17)
at emitReadable_ (_stream_readable.js:408:10)
at emitReadable (_stream_readable.js:404:5)
at readableAddChunk (_stream_readable.js:165:9)
at Socket.Readable.push (_stream_readable.js:127:10)
at TCP.onread (net.js:528:21)
```

The error itself isn't terrible, but I'd certainly rather it be returned through the HTTP request, rather than crashing the entire app.

I've tried wrapping parts of that stack in a `try` block, but it looks like the mongodb connector does some fancy magic with `nextTick` to bypass the actual stack.

Guía de contribución

Abrir la guía de contribución

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Línea de trabajo

Comienza con la ruta de inclusión de relaciones en lib/include.js y la inicialización de propiedades en lib/model.js; después, inspecciona el callback del conector en lib/mongodb.js. Reproduce una búsqueda de relación en la que versions sea un objeto en lugar de un array; estará listo cuando el fallo se devuelva a través de la solicitud HTTP en vez de provocar que la aplicación se bloquee.

Escrito por el modelo de indexación a partir del texto del issue.

Evaluación

Stack tecnológico
javascript, mongodb
Área
backend, databases
Tipo de issue
Error
Dificultad
4/5
Tiempo estimado
3-5 días
Estado de actividad
Estancado
Claridad
Bastante claro
Aptitud para principiantes
35/100

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.