Ошибка типа: User.findOne не является функцией - PullRequest
0 голосов
/ 17 февраля 2019

Я делаю api nodejs, и я хочу войти в систему с помощью jwt, я уже создаю модель и маршрут, я тестирую его на почтальоне с методом post, у меня есть коллекция под названием "user" наmongodb, но когда я отправляю сообщение с петицией, появляется эта ошибка `

TypeError: User.findOne is not a function
    at E:\AppAgricola\Proyecto\api\routes\loginRoutes.js:8:27
    at Layer.handle [as handle_request] (E:\AppAgricola\Proyecto\api\node_modules\express\lib\router\layer.js:95:5)
    at next (E:\AppAgricola\Proyecto\api\node_modules\express\lib\router\route.js:137:13)
    at Route.dispatch (E:\AppAgricola\Proyecto\api\node_modules\express\lib\router\route.js:112:3)
    at Layer.handle [as handle_request] (E:\AppAgricola\Proyecto\api\node_modules\express\lib\router\layer.js:95:5)
    at E:\AppAgricola\Proyecto\api\node_modules\express\lib\router\index.js:281:22
    at Function.process_params (E:\AppAgricola\Proyecto\api\node_modules\express\lib\router\index.js:335:12)
    at next (E:\AppAgricola\Proyecto\api\node_modules\express\lib\router\index.js:275:10)
    at Function.handle (E:\AppAgricola\Proyecto\api\node_modules\express\lib\router\index.js:174:3)
    at router (E:\AppAgricola\Proyecto\api\node_modules\express\lib\router\index.js:47:12)
    at Layer.handle [as handle_request] (E:\AppAgricola\Proyecto\api\node_modules\express\lib\router\layer.js:95:5)
    at trim_prefix (E:\AppAgricola\Proyecto\api\node_modules\express\lib\router\index.js:317:13)
    at E:\AppAgricola\Proyecto\api\node_modules\express\lib\router\index.js:284:7
    at Function.process_params (E:\AppAgricola\Proyecto\api\node_modules\express\lib\router\index.js:335:12)
    at next (E:\AppAgricola\Proyecto\api\node_modules\express\lib\router\index.js:275:10)
    at app.use (E:\AppAgricola\Proyecto\api\app.js:27:5)`

я отправляю поле пользователя и пароль на почтальона

                var express = require('express');
                var router = express.Router();
                var User = require('../models/user');
                var jwt = require('jsonwebtoken');

                router.post('/login', function(req, res, next) {

                    let promise= User.findOne({username:req.body.username}).exec();

                    promise.then(function(doc){
                        if(doc){
                            if(doc.isValid(req.body.password)){
                                let token = jwt.sign({username:doc.username}, 'secret', {expiresIn: '3h'});
                                return res.status(200).json(token);

                            }else{
                                return res.status(501).json({message: 'invalid credentials'});
                            }    
                        }else{
                            return res.status(501).json({message:'User email is not registered'})
                        }
                    });

                    promise.catch(function(err){
                        return res.status(501).json({message:'some internal error'})
                    })
                })

module.exports = router;

это модель

var mongoose= require('mongoose');
var Schema = mongoose.Schema;
var bcrypt = require('bcrypt');

var schema =  new Schema({
        username:{type:String, require:true},
        password:{type:String, require:true},
        //creation_dt:{type:String, require:true}
    },
);

schema.statics.hashPassword = function hashPassword(password){
    return bcrypt.hashSync(password, 10);
}

schema.methods.isValid = function(hashedpassword){
    return bcrypt.compareSync(hashedpassword, this.password);
}

module.export = mongoose.model ('Пользователь', схема);я хочу, чтобы метод post возвратил jwt


это метод "isValid" внутри модели, как вы можете видеть, у меня есть console.log (), который показывает мне переменную "this.пароль "и" hashedpassword ", эти переменные равны, и этот метод должен возвращать логическое = true, но возвращать" false ", я не понимаю, что происходит:

schema.methods.isValid = function(hashedpassword){
    console.log(this.password)
    console.log(hashedpassword)
    var data = bcrypt.compareSync(hashedpassword, this.password);
    console.log(data)
    return bcrypt.compareSync(hashedpassword, this.password);
}

Ответы [ 2 ]

0 голосов
/ 18 апреля 2019

Убедитесь, что экспорт выполнен правильно.

Вот что у меня сработало:

module.exports = User = mongoose.model('users', UserSchema);
0 голосов
/ 19 февраля 2019

module.export = mongoose.model('User', schema); ничего не экспортирует.

Node.js (не ES6) экспорт:

module.exports = ...;

Все, что в тройных точках является возвращаемым значением для 'require'функция.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...