2015-11-05 2 views
0
const mongoose = require("mongoose"), 
requiredAttr = {type: String, required: true}, 
employeeSchema = new mongoose.Schema({ 
     employeeNumber: { 
      type: String, 
      unique: true, 
      required: true 
     }, 
     firstName: requiredAttr, 
     lastName: requiredAttr, 
     image: requiredAttr 
    }, 
    { 
     timestamps: true //get createdAt, updatedAt fields 
    }); 

employeeSchema.methods.writeThis =() => { 

    console.log("doing writeThis"); 
    console.log(this); 
}; 

module.exports = mongoose.model("Employee", employeeSchema); 

всегда даетMongoose методы экземпляра потери контекста исполнения

doing writeThis 
{} //would think I would see my employee properties here 

я проверить некоторые основные переключения контекста через командную строку узла и найти не могу сделать следующее (как в браузере)

let test = { foo: "bar" }; 
let writeThis =() => { console.log(this); }; 
writeThis.apply(test); //or 
writeThis.bind(test); 

Что мне не хватает?

ответ

1

Функция и синтаксис Стрелка не непосредственно взаимозаменяемы:

let writeThisArrow =() => { 
    console.log(this); 
}; 
writeThisArrow.call({stuff: "things"}); 
// {} 

function writeThisFunction() { 
    console.log(this); 
} 
writeThisFunction.call({stuff: "things"}); 
// {stuff: "things"} 

В синтаксисе функции, вызов this ссылается на контекст, в котором она называется. В синтаксисе Arrow, вызывающий this ссылки на контекст, где он определен. В случае вашего использования в mongoose, это фактический самого файла. Например:

exports.stuff = "things"; 

let writeThisArrow =() => { 
    console.log(this); 
}; 
writeThisArrow.call(); 
// {stuff: "things"} 

"this" в синтаксисе стрелки неизменен, Вы не можете вводить контекст с помощью bind(), call() или apply(). В вашем случае просто вернитесь к объявлению стандартной функции, и все будет в порядке.

EDIT: Я использовал неправильную формулировку. this не неизменный в синтаксисе стрелок, вы просто не можете изменить контекст через приложение. Тем не менее, вы можете изменить его, отредактировав контекст, в котором он был определен:

exports.stuff = "things"; 
let writeThisArrow =() => { 
    console.log(this); 
}; 
writeThisArrow.call(); 
// {stuff: "things"} 

exports.otherStuff = "other things"; 
writeThisArrow.call(); 
// {stuff: "things", otherStuff: "other things"} 
+0

полностью это! Спасибо за быстрый ответ –

Смежные вопросы