如何替换Model's的save()函数

Mongoose how to replace a Model's save() function

本文关键字:save 函数 Model 何替换 替换      更新时间:2023-09-26

我已经设置了一个KeystoneJS项目,它允许你为你的模型获得一个开箱即用的管理UI。

KeystoneJS只使用一个主数据库,在主数据库中定义模型,然后每个模型在主数据库中获得自己的集合。

问题是,我有一个单独的用户数据库和一个单独的内容数据库。我正在寻找"劫持"Keystone模型,这样我就可以从我的其他数据库(目前使用猫鼬胶项目)插入模型。

我有50%在那里。我让它通过替换Keystone模型的.find().findOne()函数来读取数据,像这样

var KeystoneUser = new keystone.List('User');
KeystoneUser.add({ /* clone all fields in external model */ });
KeystoneUser.register();
var external = require("mongoose-glue");
var ExternalUser = external.model("ExternalUser")
KeystoneUser.model.find = ExternalUser.find.bind(ExternalUser)
KeystoneUser.model.findOne = ExternalUser.findOne.bind(ExternalUser)

使用上面的Keystone Admin UI可以很好地列出和浏览外部数据库中的数据。

但问题是当它涉及到保存。

如何用类似的方式替换保存函数?此外,由于上述原因,所有pre/post钩子在keystone和外部模型上都停止工作。

解决方法:

KeystoneUser.model.collection = ExternalUser.collection;

让钩子工作,然后我写了我自己的保存/更新钩子

KeystoneUser.schema.pre("save", function(next) {
    // Trick to remove everything we don't need
    var data = JSON.parse(JSON.stringify(this));
    if (typeof this.__v === "undefined") {
        new ExternalUser(data).save();
    } else {
        delete data._id;
        ExternalUser.findByIdAndUpdate(this._id, data).exec();
    }
    next();
});