TypeError: undefined is not a function in nodejs

This is my users.js model.

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; 

Since I am new to nodejs, it is very difficult to understand what this error means or why this is happening. Thus, what does error mean and how to get rid of it?

Edit: This is my newUser call.

 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); } } }); } }); 
+6
source share
1 answer

Your editing is expected to newUser you to pass more arguments than newUser . This causes fn be set to req.body.apiKey , which is apparently 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] // ... } }); 

You either want to edit the function to name the additional arguments, or remove them from the call if they are not actually needed (since you are creating an instance of UserApi both inside newUser and inside the callback).


[originally]

An error means that you are trying to call an undefined value.

One possibility is the fn argument, because newUser will try to call it whether it is a function or not:

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

But the value of fn depends on how you call newUser :

 // fn = undefined User.newUser(' email@domain ', 'password', 'username'); // fn = function User.newUser(' email@domain ', 'pass', 'user', function (err, user) { }); 

So, you either want to check that fn is a function before trying to call it:

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

Or you can pass fn directly to Model#save , which is already being processed when fn is undefined :

 instance.save(fn); 
+7
source

All Articles