2012-10-30 47 views
6

這是我的users.js模型。TypeError:undefined不是nodejs中的函數

var mongoose = require('mongoose') 
    , crypto = require('crypto') 
    , mongoTypes = require('mongoose-types'); 

mongoTypes.loadTypes(mongoose, 'email'); 
mongoose.connect('mongodb://localhost/popbroker'); 

function hash1 (msg, key) { 
    return crypto.createHmac('sha256', key).update(msg).digest('hex'); 
}; 

function required(val) { return val && val.length; } 

var Schema = mongoose.Schema 
    , ObjectId = Schema.ObjectId; 

var UserSchema = new Schema({ 
    username: { 
     type: String, 
     validate: [required,"Username is required"], 
     index: {unique: true} 
    }, 
    email: { 
     type: mongoose.SchemaTypes.Email, 
     validate: [required, 'Email required'], 
     index: { unique: true } 
    }, 
    password: { 
     type: String, 
     validate: [required, 'Password required'], 
    }, 
    socialauth:{ 
     type:String, 

    createdAt: { 
     type: Date, 
     'default': Date.now 
    } 
}); 


var UserApiSchema = new Schema({ 
    user :ObjectId, 
    apiKey: { 
     type: String, 
     validate: [required, 'Senha é obrigatório'], 
    }, 
    createdAt: { 
     type: Date, 
     'default': Date.now 
    } 
}); 


UserSchema.path('email').validate(function (v, fn) { 
    User.count({email: v}, function (err, val) { 
     if (err) fn(false); 
     fn(val==0); 
    }); 
}, 'Email exists!'); 

UserSchema.path('username').validate(function(v,fn){ 
    User.count({username:v},function(err,val){ 
    if(err) fn(false); 
    fn(val==0); 
    }); 
},'Username exists'); 

UserApiSchema.path('apiKey').validate(function(v,fn){ 
    UserApi.count({apiKey:v},function(err,val){ 
    if(err) fn(false); 
    fn(val == 0); 
    }); 
}, 'Api Key wrong'); 


UserSchema.statics.authenticate = function (email, password, fn) { 
    this.findOne({email: email}, function (err, user) { 
     if (!user) return fn(new Error('cannot find user')); 
     if (user.password == hash1(password, conf.secret)) return fn(null, user); 
     // Otherwise password is invalid 
     fn(new Error('invalid password')); 
    }) 
;}; 

UserApiSchema.statics.createApi = function(user,fn){ 
    var instance = new UserApi(); 
    instance.user = user; 
    instance.apiKey = "asdasdacas121213dasasd"; 
    console.log("username is " + user.username); 
    instance.save(function(err){ 
    fn(err,instance); 

    }); 
}; 


UserSchema.statics.getUser = function(userid){ 
    var user = mongoose.model('User', UserSchema); 
    var query = user.findOne({'_id':userid}) 
    query.exec(function (err, user) { 
    if (err) return handleError(err); 
    console.log(user.username); 
    return user; 
}); 
} 


UserApiSchema.statics.getUser = function(apiKey,fn){ 
    var usAp = UserApiSchema 
    var userApi = mongoose.model('UserApi', UserApiSchema); 
    var user = mongoose.model('User', UserSchema); 
    var query = userApi.findOne({ 'apiKey': apiKey }); 


    query.exec(function (err, userApi) { 
    if (err) return handleError(err); 
    console.log(userApi.user); 
    user = user.getUser(userApi.user); 
    fn(err, userApi);;// Space Ghost is a talk show host. 
}); 
}; 

UserSchema.statics.newUser = function (email, password,username, fn) { 
    var instance = new User(); 
    var apiInstance = new UserApi(); 
    instance.email = email; 
    instance.password = require('crypto').createHash('sha256').update(password).update('salt').digest('hex'); 
    instance.username = username; 

    instance.save(function (err) { 
     fn(err, instance); 
    }); 
}; 

UserSchema.statics.resetPassword = function(userId, callback) { 
    var newPassword = ''; 
    newPassword = newPassword.randomString(6); 
    var cripto = password; 
    var data = {} 
     data.password = crypto; 

    this.update({_id: userId} 
     , {$set: data} 
     , {multi:false,safe:true} 
     , function(error, docs) { 
      if (error) { 
       callback(error); 
      } 
      else { 
       callback(null, newPassword); 
      } 
     }); 
} 


var LinkSchema = new Schema({ 

    user: ObjectId, 

    text: { 
     type: String, 
     validate: [required,"Text is required"], 
     index: {unique: true} 
    }, 
    body: { 
     type: String, 
     validate: [required, 'Body is required'], 
     index: { unique: true } 
    }, 
    createdAt: { 
     type: Date, 
     'default': Date.now 
    } 
}) 

/* 
Exporting findByid function to return back a link based on an id. 
*/ 

LinkSchema.statics.newLink = function (text, body,user, fn) { 
    var instance = new Link(); 
    instance.text = text; 
    instance.body =body; 
    instance.user = user; 

    instance.save(function (err) { 
     fn(err, instance); 
    }); 
}; 


/* 
Export findAll function to return back all the links. 
*/ 

exports.findAll = function(req,res){ 
    console.log("Retrieving all the links"); 
    db.collection('links',function(err,collection){ 
    collecction.find().toArray(function(err,items){ 
     res.send(items); 

    }); 
    }); 
}; 



Link = mongoose.model('Link', LinkSchema); 

exports.Link = Link; 


User = mongoose.model('User', UserSchema); 
UserApi = mongoose.model('UserApi',UserApiSchema); 
exports.UserApi = UserApi; 
exports.User = User; 

由於我是nodejs的新手,很難理解這個錯誤意味着什麼或者爲什麼發生。因此,錯誤意味着什麼以及如何擺脫它?

編輯:這是我的新用戶調用。

app.post(
     '/signup/', 
     function(req, res) { 
      {console.log(req.body.username); 
       User.newUser(

        req.body.email, req.body.password,req.body.username,req.body.apiKey,"pocket", 
        function (err, user) { 
         if ((user)&&(!err)) { 
          console.log(user.username) 

          UserApi.createApi(
            user,function(err,userapi){ 
             if((!err)){ 
              console.log("Api created"); 
              res.send("APi created"); 

             } 
             else{ 
              if(err.errors.apiKey){ 
               res.send(err); 
              } 
             } 


            }); 
          req.session.regenerate(function(){ 
           req.session.user = user._id; 
           //res.send("Success here!"); 

          }); 
         } else { 
          if (err.errors.email) { 
           res.send(err) 
           console.log(req.body.password); 
           console.log(req.body.email); 
           console.log(req.body); 
          }       
          if (err.errors.username) { 
           res.send(err) 
           console.log(req.body.password); 
           console.log(req.body.email); 
           console.log(req.body); 
          } 
         } 
        }); 


      } 
     }); 
+0

告訴我們在哪兒,你叫'newUser' – soulcheck

+1

該錯誤意味着你調用一個方法的代碼,不存在。 – JohnnyHK

+0

加入JohnnyHK的答案,我遇到了同樣的問題。這是因爲我使用了錯誤的方法。例如在非數組上調用數組方法...這樣的事情會引發這種錯誤。 – Deke

回答

7

隨着您的編輯,您傳遞的參數超過newUser的問題預計會出現。這導致fn被設置的req.body.apiKey價值,這顯然是undefined

UserSchema.statics.newUser = function (email, password, username, fn) { 
    // ... 
}); 

User.newUser(    // set to... 
    req.body.email,   // => email 
    req.body.password,  // => password 
    req.body.username,  // => username 
    req.body.apiKey,  // => fn 
    "pocket",    // => (unnamed), arguments[4] 
    function(err, user) { // => (unnamed), arguments[5] 
     // ... 
    } 
}); 

你要麼想編輯的功能來命名的附加參數或從通話中刪除他們,如果他們不是真的有必要(因爲您在newUser之內以及在預期的回調中創建了UserApi實例)。


[最初]

的錯誤意味着你試圖調用undefined值。

一種可能性是fn參數爲newUser將嘗試調用它是否它實際上是一個function與否:

UserSchema.statics.newUser = function (email, password,username, fn) { 
    //... 
     fn(err, instance); 
    //... 
}); 

但,fn值取決於你如何調用newUser

// fn = undefined 
User.newUser('[email protected]', 'password', 'username'); 

// fn = function 
User.newUser('[email protected]', 'pass', 'user', function (err, user) { }); 

因此,在嘗試調用fn之前,您要麼測試fnfunction

instance.save(function (err) { 
    if (typeof fn === 'function') { 
     fn(err, instance); 
    } 
}); 

或者你也可以直接傳遞到fnModel#save,已經處理時fnundefined

instance.save(fn); 
+0

謝謝。我正在嘗試調試它。不過,我已經編輯了答案。 – Hick

相關問題