2016-11-03 2 views
-1

Ich habe einen Knoten-Server mit Mongoose, mit einem Benutzerschema. Ich versuche, eine Anmeldefunktion zu schreiben, aber ich bin die folgenden Fehler erhalten:Mongoose Schema Konstruktor nicht erkannt

TypeError: this is not a constructor

Dies wird in diesem Code vorkommen:

var mongoose = require('mongoose'); 
var passwordHasher = require('password-hash-and-salt'); 

var User = new mongoose.Schema({ 
    username: String, 
    hashedPassword: String, 
    email: String 
}); 

User.statics.signup = function(un, pw, em, cb){ 
    this.findOne({ $or:[ {'username': un}, {'email': em} ] }, function(err, person){ 
    if (err) cb(false, "Server error"); 
    else if (person == null){ 
     passwordHasher(pw).hash(function(error, hash){ 
     console.log(un, pw, em); 
     if (error) cb(false, "Server error"); 
     var newUser = new User({ username: un, hashedPassword: hash, email: em}); 
        ^(location of error) 
     newUser.save(function(err){ 
      if (err) cb(false, "Server error"); 
      else { 
      cb(true, null); 
      } 
     }); 
     }); 
    } 
    else if (person.email == em && person.username == un) cb(false, "Username and email are taken"); 
    else if (person.email == em) cb(false, "Email is taken"); 
    else if (person.username == un) cb(false, "Username is taken"); 
    }); 
} 

var model = mongoose.model('User', User); 
module.exports = model; 

Ich bin nicht sehr vertraut mit Javascript, so könnte es sein, ein einfacher Tippfehler, den ich irgendwo anders in der Methode vermisste. Ich habe jedoch irgendwelche Probleme untersucht, die ich mit ähnlichem Fehler finden konnte, die vorgeschlagenen Änderungen haben das Problem nicht behoben.

Antwort

2

Ich denke, Sie können ein neues Objekt nicht mithilfe von Schema speichern. Versuchen Sie, diese Art und Weise:

var mongoose = require('mongoose'); 
var passwordHasher = require('password-hash-and-salt'); 

var User = new mongoose.Schema({ 
    username: String, 
    hashedPassword: String, 
    email: String 
}); 

var model = mongoose.model('User', User); 
module.exports = model; 


module.exports.statics.signup = function(un, pw, em, cb){ 
    model.findOne({ $or:[ {'username': un}, {'email': em} ] }, function(err, person){ 
    if (err) cb(false, "Server error"); 
    else if (person == null){ 
     passwordHasher(pw).hash(function(error, hash){ 
     console.log(un, pw, em); 
     if (error) cb(false, "Server error"); 
     var newUser = new model({ username: un, hashedPassword: hash, email: em}); 
        ^(change this) 
     newUser.save(function(err){ 
      if (err) cb(false, "Server error"); 
      else { 
      cb(true, null); 
      } 
     }); 
     }); 
    } 
    else if (person.email == em && person.username == un) cb(false, "Username and email are taken"); 
    else if (person.email == em) cb(false, "Email is taken"); 
    else if (person.username == un) cb(false, "Username is taken"); 
    }); 
} 

Hoffnung diese Arbeit

EDIT: plese stellen Sie sicher, model.statics existiert, sonst wird es erhöhen Fehler oder Sie können Statik überspringen und die Funktion zuweisen direkt wie folgt:

module.exports.signup = function(... 
+0

Das gibt mir 'TypeError: Kann die Eigenschaft 'Anmeldung' von undefined ', in der Zeile' module.exports.statics.signup = ... ' – erdekhayser

+0

nicht setzen Das liegt daran, dass Ihre module.exports.statics' undefiniert 'ist. – thangtn

+0

Sie müssen sicherstellen, dass Ihre model.statics vorhanden ist, sonst könnten Sie tun: module.exports.signup = function (... – thangtn