Mongoose 如何替换模型的 save() 函数

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

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

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

问题是,我有一个单独的用户数据库和一个单独的内容数据库。我正在寻找 "hijack" Keystone 模型,以便我可以从我的其他数据库(目前使用 mongoose-glue 项目)插入模型。

我已经完成了 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;

这让钩子起作用了,所以我就写了自己的 save/update 钩子

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();
});