2012-05-02 36 views
0

我試圖在我的模型用戶(我使用貓鼬)上調用此函數。像這樣:Node.js TypeError:undefined不是函數

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錯誤或第一次打勾時發生'錯誤'事件 ^ TypeError:undefined不是函數

我做錯了什麼?

感謝,

+0

通常人們會看到這如果回調實際上不是一個函數。似乎無論誰稱這個函數已經通過了不良參數... – ControlAltDel

回答

4

你有2個不同的callback變量,目前:

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

由於它們共享相同的標識,第二個將「影子」一日,呈現第一個人跡罕至的匿名函數內。

要使用1st,您必須重命名其中一個 - 也許是existsCallback和/或findOneCallback

您還可能能夠徹底去除第二,因爲它似乎是undefined反正:

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

你還假定在值被過去了callback,其JavaScript不實際要求或執行。

您可以致電前通過測試值解決此問題:

if (callback) callback(...); 

或將其設置爲「無操作」功能,當它沒有定義:

callback = callback || function() { return true; }; 
//... 
callback(...); 
相關問題