Node.js 为什么我的Mongoose 3.8.7模式获取者和设置者被忽略了?
在使用Node.js、Mongoose和MongoDB时,我发现我的Mongoose模式getter和setter在执行findOne查询时不会启动 我发现了一个旧的线程,它表明2.x版中的getter和setter存在问题,但它表示问题已经解决,我正在使用最新版本的Mongoose(3.8.7) 这是我模式的一部分Node.js 为什么我的Mongoose 3.8.7模式获取者和设置者被忽略了?,node.js,mongoose,schema,setter,getter,Node.js,Mongoose,Schema,Setter,Getter,在使用Node.js、Mongoose和MongoDB时,我发现我的Mongoose模式getter和setter在执行findOne查询时不会启动 我发现了一个旧的线程,它表明2.x版中的getter和setter存在问题,但它表示问题已经解决,我正在使用最新版本的Mongoose(3.8.7) 这是我模式的一部分 function testGetter(value) { return value + " test"; } /** * Schema */ var schem
function testGetter(value) {
return value + " test";
}
/**
* Schema
*/
var schema = new Schema({
username: { type: String, required: true, unique: true, get: testGetter }
});
// I have also tried this.
schema.path('username').get(function (value, schemaType) {
return value + " test";
});
以下是我执行查询的方式
Model
.findOne(conditions, fields, options)
.populate(population)
.exec(function (error, doc) {
callback(doc, error);
});
它使用缺少“测试”后期修复的用户名值进行响应。我做错什么了吗?任何帮助都将不胜感激
其他信息
这是“查找一个”的结果:
{
"username": "Radius"
}
这是通过上述两种方法之一应用schema.path.username.getters后的值:
[ [Function: testGetter] ]
试一试
作为getter函数,这个
是您的实体实例,值
参数在这里意义不大
如果您正在编写setter函数,则必须编写
this.username=value
您是否假设虚拟机不工作,因为它们不会显示在控制台中。日志输出?如果是这样的话,那是故意的。虚拟对象是实际文档的外部对象,因此默认情况下不会使用console.log打印。要让它们显示出来,请阅读以下文档:在使用Mongoose进行查询时,getter没有修改返回的文档,这与我遇到的问题相同。要使其适用于每个查询,可以执行以下操作:
// Enable Mongoose getter functions
schema.set('toObject', { getters: true });
schema.set('toJSON', { getters: true });
主要的问题是我拥有的getter被完全忽略了。并不是返回值最终为空。我已尝试将您的建议应用于我的代码,但getter仍然未使用。谢谢你的回答!我将对我原来的问题做一些澄清。哦,你也可以尝试使用“virtual”而不是path。我已经尝试使用virtual来覆盖用户名path
schema.virtual('username').get(function(){…})
甚至尝试创建一个单独的虚拟schema.virtual('test')
,返回值为“test”,以查看虚拟是否对我有效,但没有效果。我没有查看控制台日志条目,只是将文档作为响应发送回。在阅读了您给我的文档片段之后,我将doc
更改为doc.toObject({getters:true,setters:true,virtuals:true})
,它现在可以工作了。谢谢!这对我有用。谢谢然而,你能解释一下为什么我们需要提到以上这些吗?设置器似乎在不启用Mongoose设置器功能的情况下工作。
// Enable Mongoose getter functions
schema.set('toObject', { getters: true });
schema.set('toJSON', { getters: true });