[Mongoose] Schema.Types.Mixed のフィールドに Error オブジェクトを保存する

Tadashi Shigeoka ·  Tue, May 16, 2017

Mongoose の Schema.Types.Mixed のフィールドに Node.js の Error オブジェクトをそのままだと保存できなかったので、toString() や _.toPlainObject() して保存したというお話です。

mongoose | マングース

Schema.Types.Mixed に Error を保存してみたサンプルコード

(例) Error をそのまま保存できなかったサンプルコード

var err = new Error('bad');

Model.updateOne({
  _id: targetId
}, {
  'mixedField': err ? err.toString() : null
}, function(updatedErr) {
});

(例) Error を toString して保存したサンプルコード

var err = new Error('good');

Model.updateOne({
  _id: targetId
}, {
  'mixedField': err ? err.toString() : null
}, function(updatedErr) {
});

(例) Error を loadsh.toPlainObject して保存したサンプルコード

const _ = require('lodash');
var err = new Error('good');

Model.updateOne({
  _id: targetId
}, {
  'mixedField': err ? _.toPlainObject(err) : null
}, function(updatedErr) {
});

まとめ

MongoDB に Error オブジェクトが保存されてなくて悩んだのですが MongoDB の LogLevel の設定を変更して、確認したところ、そもそも update method に値が渡っていませんでした。

Schema.Types.Mixed のフィールドにはなんでも保存できると思っていたのですが、Mongoose のレイヤーで Error オブジェクトは cast してくれず、何も保存されないという処理になっているようでした。

Mongoose のソースコードまでは未だ読めてないので、後ほど読んでみたいと思います。

参考情報