Mongoose模型作为具有继承链的ES6类

时间:2017-04-11 10:28:16

标签: node.js mongoose es6-class

我试图创建一个ES6类层次结构来实现mongoose和mongodb查询之间的缓存层。我看到了这个PR 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静态方法时,调用没有达到findOne Base 类中的方法。我不知道我哪里错了。任何人都可以对此有所了解。

1 个答案:

答案 0 :(得分:3)

我昨天真的面对这个问题。

以下是我工作的代码:

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关键字,因此会产生种族效应。

我创建此代码以在创建父文件时自动创建子文档(使用默认值),而不是执行此操作 let prt = new Parent({}).save()然后(跟随文档):Parent.find({id: prt.id}).populate('child')

这有点记录错误,或者我错过了正确的文档......