我试图创建一个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 类中的方法。我不知道我哪里错了。任何人都可以对此有所了解。
答案 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')
。
这有点记录错误,或者我错过了正确的文档......