2012-05-02 27 views
0

私のモデルUser(私はmongooseを使用しています)でこの関数を呼び出そうとしています。このような:Node.js TypeError:未定義は関数ではありません

UserSchema.statics.exists = function exists(req,email, callback) { 
    this.findOne({ 
     email : email 
    }, function(err, user,callback) { 
     if(err) { 
      console.error(err); 
      return callback(err); 
     } 
     if(!user) { 
      // console.log("Not user"); 
      return callback(null, false);// produce error 
     } 
     if(!user.valid) { 
      console.log("User invalid"); 
      var hostname = req.headers.host; 
      // hostname = 'localhost:8080' 
      //var pathname = url.parse(req.url).pathname; // pathname = '/MyApp' 

      var base_url = 'http://' + hostname + '/activation?key=' + user.account_no; 
      user.verifyEmail(base_url, user, function(err, result) { 
       if(err) { 
        console.error(err); 
       return callback(err); 
       } else { 
        //if(email sent) 
        if(result) { 
        return callback("Please check your email to activate your account"); 
        } else { 
        return callback("Activation error please contact WOWITO support"); 
        } 
       } 
      }); 
     } 
     return callback(null, user); 
    }); 
} 

が、その後、私は、次のエラーを得た:

のNode.js:201 スロー電子; // process.nextTickエラー、または最初のチェックで 'error'イベント ^ TypeError:未定義は関数ではありません

どうしたのですか?

おかげで、

+0

通常1がこれを見るでしょうコールバックが実際に関数でない場合この関数を呼び出した人が悪いパラメータを渡したようです... – ControlAltDel

答えて

4

あなたは現在、2つの異なるcallback変数を、持っている:彼らは同じ識別子を共有すると、第二は、「影」第一、匿名関数内で第一アクセスできないをレンダリングします

UserSchema.statics.exists = function exists(req, email, callback) { // 1st 
    this.findOne({ 
     email : email 
    }, function(err, user, callback) { // 2nd 
    // ... 

第1を使用するには、おそらくexistsCallbackおよび/またはfindOneCallbackのいずれかの名前を変更する必要があります。

また、とにかくundefinedのようですので、完全に、第二を削除することができる場合があります

UserSchema.statics.exists = function exists(req, email, callback) { 
    this.findOne({ 
     email : email 
    }, function(err, user) { 
    // ... 

ます。また、値はJavaScriptを実際にしない、callbackのために渡されていると仮定しています要求するか施行する。

あなたが呼び出す前に値をテストすることによってこの問題を解決することができます

if (callback) callback(...); 

それともそれが定義されていないとき、「ノーオペレーション」機能に設定します。

callback = callback || function() { return true; }; 
//... 
callback(...); 
関連する問題