mongoose中的虚拟属性,'this'是空对象

12

好的,我对mongoose还不熟悉,并且正在尝试理解如何使用虚拟属性。这是我一直在测试的示例代码。

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

当我在虚拟getter函数的开头记录“this”时,它会打印{}。我做错了什么?

1个回答

39
问题出在虚拟函数中使用的箭头函数上,同样的问题可以在这里找到ES6匿名函数和模式方法,原因是箭头函数的词法this特性。
要解决这个问题,请按以下方式更改您的代码。
objSchema.virtual('hour').get(function(){
    console.log(this.created);
    var d = new Date(this.created);
    return d.getHours();
});

2
谢谢,我自己永远也想不出来。 - Shahriar HD
1
有没有一种优雅的方法来避免这个问题,同时使用“fat arrow”语法?谢谢。 - theprogrammer
同样的情况在这里,即使是8年前的代码,这也为我节省了数小时的调试时间。 - sebastian-greco
在这里节省了数小时的调试时间...感谢您的提问和回答!!! - Martin Moss

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接