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();
});
我已经建立了一个 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();
});