2017-02-17 23 views
2

У меня есть эта Mongoose схема в приложении Nodejs:Почему я не могу получить доступ к методу схемы мангуста?

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); 

И я создал этот файл маршрутов.

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.' }); 
      }; 
     }); 
    }); 
}; 

Затем я использую почтальон, чтобы сделать вызов 127.0.0.1:3001/user/isvalid с соответствующим содержанием тела. Терминал говорит, скажите мне TypeError: User.comparePassword is not a function и выйдет из строя приложение.

Поскольку бит if (user) проходит, это указывает на то, что я правильно достал документ из Mongo и имел экземпляр схемы пользователя. Почему метод недействителен?

ета: экспортный модуль мне не удалось скопировать/вставить первоначально

+1

Добавить в конец модуля модели пользователя: 'module.exports = mongoose.model ('User', UserSchema);' – dNitro

+0

@dNitro Мне не удалось скопировать/вставить это, но это в моем фактическом коде. Хороший улов. Редактирование, чтобы добавить его –

ответ

4

Это создает метод экземпляра:

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

Если вы хотите статический использовать метод это:

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

Статические методы если вы хотите назвать это User.comparePassword().

Методы экземпляра - это когда вы хотите называть его someUser.comparePassword() (что в этом случае имеет большой смысл, так что вам не нужно будет явно передавать экземпляр пользователя).

Смотрите документацию:

+0

, поэтому, учитывая код, который я представил, передача в '(user)' должна означать, что 'user.comparePassword()' должен работать, но он дает ту же ошибку. оставив его как есть и используя 'UserSchema.statics.comparePassword' в определении схемы, работает, поэтому я не сомневаюсь в этом. Наверное, я просто смущен. –