Mongoose模型作为ES6类与inheritance链

我正在尝试创build一个ES6类层次结构来实现mongoose和mongodb查询之间的caching层。 我看到这个公关https://github.com/Automattic/mongoose/pull/4668和基于这写下面的代码。

'use strict' const mongoose = require('mongoose'); mongoose.connect("mongodb://host:port/db", {}); mongoose.connection.on('error', console.error.bind(console, 'DB connection failed', arguments)); mongoose.connection.once('open', console.log.bind(console, 'Connected to DB')); class Base extends mongoose.Model { save() { console.log('Base class save()') return super.save(); } findOne(query){ console.log('Base class find...'); return super.findOne(query); } } class Derived extends Base{ save(){ console.log('Derived class save()'); super.save(); } static getOne(){ console.log('Derived class Get one'); return this.findOne({}); } } let usersSchema = new mongoose.Schema({ name: String }) usersSchema.loadClass(Derived); let User = mongoose.model(Derived, usersSchema, 'users'); setTimeout(function(){ User.getOne() .then(user => console.log('Found user...', user)); let newUser = new User(); console.log('newUser instance of Derived ? ', (newUser instanceof Derived)); console.log('newUser instance of Base ? ', (newUser instanceof Base)); newUser.name = 'Tony'; newUser.save() .then(result => console.log('Saved', result)); }, 2000); 

由于在派生类中重写了方法,因此期望调用Derived类中的方法将依次调用Base类,然后可以在查询之前/之后在Base类中添加其他逻辑。

下面是我得到的输出,这表明方法调用没有达到Derived / Base类。

产量

 Connected to DB Derived class Get one newUser instance of Derived ? true newUser instance of Base ? true Base class save() Found user... { _id: 58ec765f9dd99f049c2a833b, name: 'Tony', __v: 0 } 

当我调用save方法时,它不会触及Derived类,当我调用Derived类中的getOne静态方法时,调用不会触及Base类中的findOne方法。 我不知道我哪里错了。 任何人都可以对此有所了解。

我昨天从字面上面对这个问题。

这是我工作的代码:

 class User extends mongoose.Model { constructor(user) { super(user); this.settings = new UserSettings({userId: this._id}); } async save(callback) { try { await this.settings.save(); return super.save(callback); } catch (error) { throw error; } } //implement only if you want to use create... static async create(obj, callback) { let user = new User(obj); return user.save(callback); } } 

我认为你错过了async关键字,从而有种族影响。

我创build了这个代码来创build子文档(使用默认值),而不是let prt = new Parent({}).save() Parent.find({id: prt.id}).populate('child')

这有点不好logging,或者我错过了正确的文件…

Interesting Posts