猫鼬中的虚拟对象,“this”是空对象

Posted

技术标签:

【中文标题】猫鼬中的虚拟对象,“this”是空对象【英文标题】:Virtuals in mongoose, 'this' is empty object 【发布时间】:2016-06-18 02:12:20 【问题描述】:

好的,我是猫鼬的新手,并试图了解如何使用虚拟属性。这是我一直在测试的示例代码。

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var objSchema = new Schema(
  created: type: Number, default: Date.now(),
);

objSchema.virtual('hour').get(()=>
  //console.log(this);
  var d = new Date(this.created);
  return d.getHours();
);

var obj = mongoose.model('obj', objSchema);

var o = new obj();
o.toObject(virtuals: true);
console.log(o.created);
console.log(o.hour);

所以我希望日志类似于:

1457087841956
2

但输出是

1457087841956
NaN

当我在虚拟吸气剂的开头记录“this”时,它会打印 。 我究竟做错了什么?

【问题讨论】:

【参考方案1】:

问题是virtual函数中使用的arrow function,同样的问题可以在这里找到ES6 anonymous function and schema methods,原因是arrow function的Lexical this特性

要解决它,请更改您的代码如下

objSchema.virtual('hour').get(function()
    console.log(this.created);
    var d = new Date(this.created);
    return d.getHours();
);

【讨论】:

谢谢,一百万年我都想不通:) 在使用fat arrow 语法的同时,有没有一种优雅的方法可以避免这个问题?谢谢 这里一样,这让我节省了数小时的调试时间,即使是 8 年前的情况

以上是关于猫鼬中的虚拟对象,“this”是空对象的主要内容,如果未能解决你的问题,请参考以下文章

带有嵌套地图的 Promise.all .. 第一张地图仅适用于其他人在猫鼬中返回空对象

从猫鼬中的数组对象中选择特定项目

创建新对象时,猫鼬中的值不会增加

如何仅在猫鼬中使用聚合填充嵌套在对象数组中的字段?

如何填充数组内的对象和猫鼬中的另一个数组中的所有用户字段

扩展模式猫鼬中的“虚拟”继承方法不起作用