loopbackio / loopbackio/loopback-datasource-juggler

Model errors when using relations with the MongoDB connector cause crashes

オープン
#111 コメント 11 件 リアクション 0 件 担当者 0 名 GitHub で見る

まだ誰も着手していません。

bug help wanted major needs-reproduction
主要言語
JavaScript
スター
282
フォーク
366
平均マージ
17時間 4分
マージ済み PR(30日)
10

説明

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.

コントリビューションガイド

コントリビューションガイドを開く

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

調査の方向性

lib/include.js のリレーション包含パスと lib/model.js のプロパティ初期化から始め、次に lib/mongodb.js のコネクタコールバックを調べます。versions が配列ではなくオブジェクトになっているリレーション検索を再現します。アプリケーションをクラッシュさせるのではなく、HTTP リクエストを通じて失敗が返されれば完了です。

索引モデルが issue の本文から書いたものです。

評価

技術スタック
javascript, mongodb
領域
backend, databases
issue の種類
バグ
難易度
4/5
見積もり時間
3〜5日
活発さ
停滞
明瞭さ
おおむね明確
初心者へのやさしさ
35/100

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。