2017-02-17 6 views
2

Ich habe dieses Mongoose Schema in einer NodeJS Anwendung:Warum kann ich nicht auf die Methode eines Mungoschemas zugreifen?

const mongoose = require('mongoose'), 
    Schema = mongoose.Schema, 
    sodium = require('sodium').api; 

const UserSchema = new Schema({ 
    username: { 
     type: String, 
     required: true, 
     index: { unique: true } 
    }, 
    salt: { 
     type: String, 
     required: false 
    }, 
    password: { 
     type: String, 
     required: true 
    } 
}); 

UserSchema.methods.comparePassword = function(candidatePassword, targetUser) { 
    let saltedCandidate = candidatePassword + targetUser.salt; 
    if (sodium.crypto_pwhash_str_verify(saltedCandidate, targetUser.password)) { 
     return true; 
    }; 
    return false; 
}; 

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

Und Ich habe diese Routen-Datei.

const _ = require('lodash'); 
const User = require('../models/user.js'); // yes, this is the correct location 

module.exports = function(app) { 
    app.post('/user/isvalid', function(req, res) { 
     User.find({ username: req.body.username }, function(err, user) { 
      if (err) { 
       res.json({ info: 'that user name or password is invalid. Maybe both.' }); 
      }; 
      if (user) { 
       if (User.comparePassword(req.body.password, user)) { 
        // user login 
        res.json({ info: 'login successful' }); 
       }; 
       // login fail 
       res.json({ info: 'that user name or password is invalid Maybe both.' }); 
      } else { 
       res.json({ info: 'that user name or password is invalid. Maybe both.' }); 
      }; 
     }); 
    }); 
}; 

Ich benutze Postman dann einen Anruf zu 127.0.0.1:3001/user/isvalid mit einem entsprechenden Körper Inhalt zu machen. Das Terminal sagt mir TypeError: User.comparePassword is not a function und stürzt die App ab.

Da das if (user) Bit übergibt, bedeutet das für mich, dass ich ein Dokument von Mongo ordnungsgemäß abgerufen habe und eine Instanz des Benutzerschemas habe. Warum ist die Methode nicht gültig?

eta: Das Modul Export Ich kopiere fehlgeschlagen/Paste ursprünglich

+1

Hinzufügen von Benutzermodell-Modul beenden: 'module.exports = mongoose.model ('User', UserSchema);' – dNitro

+0

@ dNitro ich konnte das nicht kopieren/einfügen, aber es ist in meinem tatsächlichen Code. Guter Fang. Bearbeiten, um es hinzuzufügen –

Antwort

4

Dies schafft Instanzmethode:

UserSchema.methods.comparePassword = function(candidatePassword, targetUser) { 
    // ... 
}; 

Wenn Sie eine statische Methode verwenden wollen, dass diese:

UserSchema.statics.comparePassword = function(candidatePassword, targetUser) { 
    // ... 
}; 

Statische Methoden sind, wenn Sie es als User.comparePassword() nennen möchten.

Instanzmethoden sind, wenn Sie es als someUser.comparePassword() aufrufen möchten (was in diesem Fall sehr sinnvoll wäre, so dass Sie die Benutzerinstanz nicht explizit übergeben müssten).

Lesen Sie die Dokumentation:

+0

so gegeben, dass der Code, den ich vorstellte, '(user)' übergeben sollte bedeuten, dass 'user.comparePassword()' sollte funktionieren, aber es gibt den gleichen Fehler. verlassen es wie es ist und die Verwendung von 'UserSchema.statics.comparePassword' in der Schema-Definition funktioniert, so dass ich nicht zweifle. Ich bin nur verwirrt, denke ich. –

Verwandte Themen