Mongoose メソッド

GROWI でよく使われるMongooseのメソッドに関して、、、

await user.deleteImage();

などとPromiseが返ってくるの期待するので、このuser.deleteImage()がしっかりとPromiseオブジェクトを返すように設計、っと思っているでしょう ( return new Promise((resolve, reject) => {});)。

実際にuser.deleteImage();をみてみよう

userSchema.methods.deleteImage = async function() { validateCrowi(); const Attachment = crowi.model('Attachment'); // the 'image' field became DEPRECATED in v3.3.8 this.image = undefined; if (this.imageAttachment != null) { Attachment.removeWithSubstanceById(this.imageAttachment._id); } this.imageAttachment = undefined; return this.save(); };

うーむ、この時点ではthis.save()Promiseであるかというと微妙なところかな。

そしたら!

this.save()はMongooseのメソッドで、Promiseまたはundefinedを返してるみたい(https://mongoosejs.com/docs/api.html#model_Model-save external_link 参考)。undefinedはcallbackに使うときだけだから、この場合ではPromiseを返すことがわかる。Mongooseのメソッドに関して他をみると、結構Promise返すメソッドが多いようですね。すると、新しくPromiseオブジェクトを作成してそれ自体をリターンするといった流れは不要になる。