質問

Now.jsとMongooseをノードプロジェクトで使用しており、Mongoose関数内のthis.nowオブジェクトにアクセスするのに苦労しています。例えば

everyone.now.joinDoc = function (project_id){  
  this.now.talk(); //this will work
  Project.findOne({'_id':project_id}, function(err, project){
    if(project){
      this.now.talk(); // this will not work "TypeError: Cannot call method 'bark' of undefined"
    };
  });
};
役に立ちましたか?

解決

これにコードを変更します:

everyone.now.joinDoc = function (project_id){  
  this.now.talk();  // this will work
  var that = this;  // save 'this' to something else so it will be available when 'this' has been changed
  Project.findOne({'_id':project_id}, function(err, project){
    if(project){
      that.now.talk();  // use local variable 'that' which hasn't been changed
    };
  });
};

内部関数の内側、 this おそらく何か他のものに設定されています。したがって、アクセスする値を維持するには、内部関数で使用できる別のローカル変数に割り当てます。

他のヒント

everyone.now.joinDoc = function (project_id){  
  this.now.talk();  // this will work
  Project.findOne({'_id':project_id}, (function(tunnel, err, project){
    if(project){
      this.now.talk(); 
    };
  }).bind(this, "tunnel")); // overwrite `this` in callback to refer to correct `this`
};

使用する Function.prototype.bind の値を設定します this あなたが望む価値に

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top