Я делаю 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);
}