2017-03-12 7 views
-1

私はnodejs、express、mongooseを学習しています。私は、データベースから文書を取り出すために使用されるfindOne関数に関する質問を思いつきました。 通常は、このようにそれを使用します。モンゴースコールバック関数エラー

Product.findOne({_id: req.params.id},function(error, result){ 
     res.send(result); 
}); 

しかし、私は次の操作を実行しようとしたとき、それは(私は学習のためにそれをやった)に失敗しました:

Product.findOne({_id: req.params.id}, returnFunction(res)); 

function returnFunction(res,error, result){ 
    //error and result are provided by the findOne callback function 
    return function(){ 
      res.send(result); //doesnt work 
     }; 
    } 

しかし、私ならばパラメータを内部関数に渡すと、完全に動作します。

Product.findOne({_id: req.params.id}, returnFunction(res)); 

function returnFunction(res,error, result){ 
     //error and result are provided by the findOne callback function 
     return function(res,result){ 
      res.send(result); 
     }; 
} 

外部関数の変数にアクセスすることはできませんか?

ありがとうございました。

+2

はい、しかし、あなたは 'res'を渡すので、' error'と 'result'は定義されていません。 – JJJ

+0

しかし、関数に暗黙的なエラーと結果はありませんか?私が言ったように、たとえ私がそれらの変数に合格しなかったとしても、最後のコードは完全に働いたからです。 –

+1

あなたがあなた自身を呼び出すものではなく、*あなたが返す関数に暗黙のうちに*されています。 – JJJ

答えて

1

returnFunction(res)に電話すると、実際に関数が返されます。

あなたはあなたのような関数を定義した場合:

function returnFunction(res, error, result){ 
    return function(){ 
      res.send(result); 
     }; 
    } 

あなたは引数をとらない機能が戻ってきています。これは

Product.findOne({_id: req.params.id}, function(){ 
     res.send(result); // result is undefined here 
}); 

の同等だろう。しかし、あなたがあなたのような関数を定義する場合:

function returnFunction(res){ 
     return function(error, result){ 
      res.send(result); // res is defined 
     }; 

それはOKです。

Product.findOne({_id: req.params.id},function(error, result){ 
     res.send(result); 
}); 
+0

私はそれを今得ます!どうもありがとう!! :) –