【问题标题】:Virtuals in mongoose, 'this' is empty object猫鼬中的虚拟对象,“this”是空对象
【发布时间】: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”时,它会打印 {}。 我究竟做错了什么?

【问题讨论】:

    标签: node.js mongodb mongoose mongoose-schema


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢,一百万年我都想不通:)
    • 在使用fat arrow 语法的同时,有没有一种优雅的方法可以避免这个问题?谢谢
    • 这里一样,这让我节省了数小时的调试时间,即使是 8 年前的情况
    猜你喜欢
    • 1970-01-01
    • 2019-08-30
    • 1970-01-01
    • 2021-06-26
    • 2012-07-01
    • 2021-01-03
    • 1970-01-01
    • 2012-06-05
    • 2017-04-27
    相关资源
    最近更新 更多