[Mongoose] Schema.Types.Mixed のフィールドに Error オブジェクトを保存する
Mongoose の Schema.Types.Mixed のフィールドに Node.js の Error オブジェクトをそのままだと保存できなかったので、toString() や _.toPlainObject() して保存したというお話です。
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 のソースコードまでは未だ読めてないので、後ほど読んでみたいと思います。
参考情報
- Mongoose SchemaTypes
- Errors | Node.js Documentation
- Object.prototype.toString() – JavaScript | MDN
- Lodash Documentation