user.setPassword不是函数-护照本地猫鼬 [英] user.setPassword is not a function - passport local mongoose

查看:265
本文介绍了user.setPassword不是函数-护照本地猫鼬的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在为我的网站用户实施重置密码功能.但是,当用户在reset.ejs页面上确认新密码时,似乎会引发此错误.

I am implementing a reset password feature on for the users of my website. However, it seems to throw this error when the user confirms new password at the reset.ejs page.

正在正确执行以下步骤:

The following steps are being performed correctly:

  • 通过邮件发送的令牌
  • 单击令牌后,将打开新的密码页面

当用户输入新密码并确认新密码并按下按钮以保存新密码时,users.js user.setPassword 中的功能不起作用,因为下面提到了该错误.它是护照本地猫鼬的内置功能.<​​/p>

When user enters new password and confirm new password and hits the button to save the new password, the function in users.js user.setPassword does not work as the error is mentioned below. It is a built in function of passport-local-mongoose.

错误:user.savePassword不是函数

ERROR: user.savePassword is not a function

包括以下所有代码文件:

Including all the code files below:

users.js:

users.js:

var express = require('express');
var router = express.Router();
var multer = require('multer');
var upload = multer({dest: './uploads'});
var passport = require('passport');
var mongoose  = require('mongoose');
var LocalStrategy = require('passport-local').Strategy;
var randomstring = require("randomstring");
var User = require('../models/user');
var data=require('../models/data');
var checklist=require("../models/checklist");
var async = require("async");
var crypto = require("crypto");
var passportLocalMongoose=require("passport-local-mongoose");

// "use strict";
const nodemailer = require("nodemailer");

var transporter = nodemailer.createTransport({
    service: 'gmail',
    auth: {
      user: 'dataseedltd@gmail.com',
      pass: 'mypassword'
    }
  });  


/* GET users listing. */
router.get('/', function(req, res, next) {
  res.send('respond with a resource');
});


router.get('/register/:type', function(req, res, next) {

  res.render('user/register.ejs',{title:'Register',type:req.params.type});
});

router.get('/login', function(req, res, next) {
  res.render('user/login.ejs', {title:'Login'});
});

router.post('/login',
  passport.authenticate('local',{failureRedirect:'/users/login', failureFlash: 'Invalid username or password'}),
  function(req, res) {
        var previouspath=req.cookies.previouspath;    

        if(req.cookies.checklist==undefined){
           req.flash('success', 'You are now logged in');
             if(req.user.as=='seller'){
                if(previouspath!=undefined){
                if(previouspath.length!=0)
                res.redirect(previouspath);
                else
                res.redirect('/buyer');
                }
                else
                res.redirect('/buyer');            
                }
             else {
                if(previouspath!=undefined){
                      if(previouspath.length!=0)
                      res.redirect(previouspath);
                      else
                      res.redirect('/buyer');
                }
                else
                res.redirect('/buyer');
             }
          }
        else{
         var ids=req.cookies.checklist['data']

                            var checks=[];
                        for(var i=0;i<ids.length;i++){
                            checks.push({user:req.user,data:ids[i]});
                        }
                  checklist.insertMany(checks,function(err, d) {
                     if(err)console.log(err); 

                     res.clearCookie('checklist'); 
               req.flash('success', 'You are now logged in');
             if(req.user.as=='seller'){
                 if(previouspath.length!=0)
                res.redirect(previouspath);
                else
                res.redirect('/seller')

             }
             else {
                if(previouspath.length!=0)
                res.redirect(previouspath);
                else
                res.redirect('/buyer')
             }
         }); 
        } 
});

passport.serializeUser(function(user, done) {
  done(null, user.id);
});

passport.deserializeUser(function(id, done) {
  User.getUserById(id, function(err, user) {
    done(err, user);
  });
});

passport.use(new LocalStrategy(function(username, password, done){
  User.getUserByUsername(username, function(err, user){
    if(err) throw err;
    if(!user){
      return done(null, false, {message: 'Unknown User'});
    }

    User.comparePassword(password, user.password, function(err, isMatch){
      if(err) return done(err);
      if(isMatch){
        return done(null, user);
      } else {
        return done(null, false, {message:'Invalid Password'});
      }
    });
  });
}));

router.post('/register/:type',function(req, res, next) {
  var name = req.body.name;
  var email = req.body.email;
  var username = req.body.username;
  var institution=req.body.institution;
    var education=req.body.education;
    var proffession=req.body.proffession;
  var   country=req.body.country;
  //check if email does not already exists
  //check if username does not already exists

  User.find({ $or: [ { email: { $eq: req.body.email } }, { username: { $eq: req.body.username } } ] },function(err,data){
    if(err)console.log(err);
    if(data.length!=0){

    console.log(data.length);
     req.flash('success','email or username is repeated.');
     res.redirect('/users/register/'+req.params.type);

    }
    else
    {

        var password = req.body.password;
        var password2 = req.body.password2;
        var as      =req.params.type;

        // Form Validator
        req.checkBody('name','Name field is required').notEmpty();
        req.checkBody('email','Email field is required').notEmpty();
        req.checkBody('email','Email is not valid').isEmail();
        req.checkBody('username','Username field is required').notEmpty();
        req.checkBody('password','Password field is required').notEmpty();

        // Check Errors
        var errors = req.validationErrors();

        if(errors){
            res.render('user/register.ejs', {
                errors: errors
            });
        } else{
            var newUser = new User({
            name: name,
            email: email,
            username: username,
            password: password,
            as          :as,
            institution:institution,
             education:education,
             proffession:proffession,
            country:country
          });

          User.createUser(newUser, function(err, user){
            if(err) throw err;
            console.log(user);
          });

          // res.location('/');
      var token=randomstring.generate(7);
      var to=req.body.email;
      var subject='Email Confirmation from dataSeed ';
      var message='<h1>Use this code to register </h1><p>Your verification Code is: <h2>'+token+'</h2></p>';
        var mailOptions=sendmail(to,subject,message);
        transporter.sendMail(mailOptions, function(error, info){
                          if (error) {
                              console.log(error);
                          }
                          else
                          {
                                res.render('user/emailconfirmation.ejs',{username:req.body.username,token:token});

                          }
        });



        }



      }


  });  

  function sendmail(to,subject,message){

    var mailOptions = {
    from: 'dataseedltd@gmail.com',
    to: to,
    subject: subject,
    html: message 

    };
    return mailOptions;

}

  router.post('/emailconfirmation/:token',function(req, res) {
      if(req.params.token==req.body.token){
              req.flash('success', 'You are now registered and can login');
                res.redirect('/');        
        }
        else{
            User.remove({username:req.body.username},function(err,data){
              if(err)console.log(err);
              res.redirect('/');

              });  
        }
  });
});

router.get('/logout', function(req, res){
  req.logout();
  req.flash('success', 'You are now logged out');
  res.redirect('/users/login');
});


//Forgot Password
router.get('/forgot',function(req,res){
  res.render("forgotpassword.ejs");
  });


  router.post('/forgot', function(req, res, next) {
  async.waterfall([
    function(done) {
      crypto.randomBytes(20, function(err, buf) {
        var token = buf.toString('hex');
        done(err, token);
      });
    },
    function(token, done) {
      User.findOne({ email: req.body.email }, function(err, user) {
        if (!user) {
          req.flash('success', 'No account with that email address exists.');
          return res.redirect('/users/forgot');
        }

        user.resetPasswordToken = token;
        user.resetPasswordExpires = Date.now() + 3600000; // 1 hour

        user.save(function(err) {
          done(err, token, user);
        });
      });
    },
    function(token, user, done) {
      var smtpTransport = nodemailer.createTransport({
        service: 'Gmail', 
        auth: {
          user: 'dataseedltd@gmail.com',
          pass: 'mypassword'
        }
      });
      var mailOptions = {
        to: user.email,
        from: 'dataseedltd@gmail.com',
        subject: 'Node.js Password Reset',
        text: 'You are receiving this because you (or someone else) have requested the reset of the password for your account.\n\n' +
          'Please click on the following link, or paste this into your browser to complete the process:\n\n' +
          'http://' + req.headers.host + '/users/reset/' + token + '\n\n' +
          'If you did not request this, please ignore this email and your password will remain unchanged.\n'
      };
      smtpTransport.sendMail(mailOptions, function(err) {
        console.log('mail sent');
        req.flash('success', 'An e-mail has been sent to ' + user.email + ' with further instructions.');
        done(err, 'done');
      });
    }
  ], function(err) {
    if (err) return next(err);
    res.redirect('/users/forgot');
  });
});

router.get('/reset/:token', function(req, res) {
  User.findOne({ resetPasswordToken: req.params.token, resetPasswordExpires: { $gt: Date.now() } }, function(err, user) {
    if (!user) {
      req.flash('success', 'Password reset token is invalid or has expired.');
      return res.redirect('/users/forgot');
    }
    res.render('reset', {token: req.params.token});
  });
});

router.post('/reset/:token', function(req, res) {
  async.waterfall([
    function(done) {
      User.findOne({ resetPasswordToken: req.params.token, resetPasswordExpires: { $gt: Date.now() } }, function(err, user) {
        if (!user) {
          req.flash('error', 'Password reset token is invalid or has expired.');
          return res.redirect('back');
        }
        if(req.body.password === req.body.confirm) {
          user.setPassword(req.body.password, function(err) {
            user.resetPasswordToken = undefined;
            user.resetPasswordExpires = undefined;

            user.save(function(err) {
              req.logIn(user, function(err) {
                done(err, user);
              });
            });
          })
        } else {
            req.flash("error", "Passwords do not match.");
            return res.redirect('back');
        }
      });
    },
    function(user, done) {
      var smtpTransport = nodemailer.createTransport({
        service: 'Gmail', 
        auth: {
          user: 'dataseedltd@gmail.com',
          pass: 'mypassword'
        }
      });
      var mailOptions = {
        to: user.email,
        from: 'dataseedltd@gmail.com',
        subject: 'Your password has been changed',
        text: 'Hello,\n\n' +
          'This is a confirmation that the password for your account ' + user.email + ' has just been changed.\n'
      };
      smtpTransport.sendMail(mailOptions, function(err) {
        req.flash('success', 'Success! Your password has been changed.');
        done(err);
      });
    }
  ], function(err) {
    res.redirect('/login');
  });
});
module.exports = router;

users.js(模型):

users.js (model):

var mongoose = require('mongoose');
var bcrypt = require('bcryptjs');
var passportLocalMongoose=require("passport-local-mongoose");
mongoose.connect('mongodb://localhost/dataseed');

var db = mongoose.connection;

// User Schema
var UserSchema = mongoose.Schema({
    username: {
        type: String,
        index: true
    },
    password: {
        type: String
    },
    email: {
        type: String
    },
    name: {
        type: String
    },
    profileimage:{
        type: String
    },
    as:{
        type:String
    },
    institution:{
        type:String
    },
    education:{
        type:String

    },
    proffession:{
        type:String
    },
    country:{
        type:String
    },
    resetPasswordToken: String,
    resetPasswordExpires: Date

});

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

module.exports.getUserById = function(id, callback){
    User.findById(id, callback);
}

module.exports.getUserByUsername = function(username, callback){
    var query = {username: username};
    User.findOne(query, callback);
}

module.exports.comparePassword = function(candidatePassword, hash, callback){
    bcrypt.compare(candidatePassword, hash, function(err, isMatch) {
        callback(null, isMatch);
    });
}

module.exports.createUser = function(newUser, callback){
    bcrypt.genSalt(10, function(err, salt) {
        bcrypt.hash(newUser.password, salt, function(err, hash) {
            newUser.password = hash;
            newUser.save(callback);
        });
    });
}

推荐答案

似乎您没有在用户模型下定义的名为 setPassword 的方法.这主要是因为您没有将 passport-local-mongoose 插入 UserSchema .在从 UserSchema 创建模型之前,添加 UserSchema.plugin(passportLocalMongoose); .像这样

It seems like you don't have a method called setPassword defined under user model. This is mainly because you haven't plugin the passport-local-mongoose to UserSchema. Add UserSchema.plugin(passportLocalMongoose); before creating the model from UserSchema. like this

    var mongoose = require('mongoose');
    var bcrypt = require('bcryptjs');
    var passportLocalMongoose=require("passport-local-mongoose");
    mongoose.connect('mongodb://localhost/dataseed');

    var db = mongoose.connection;

    // User Schema
    var UserSchema = mongoose.Schema({
        username: {
            type: String,
            index: true
        },
        password: {
            type: String
        },
        email: {
            type: String
        },
        name: {
            type: String
        },
        profileimage:{
            type: String
        },
        as:{
            type:String
        },
        institution:{
            type:String
        },
        education:{
            type:String

        },
        proffession:{
            type:String
        },
        country:{
            type:String
        },
        resetPasswordToken: String,
        resetPasswordExpires: Date

    });

    UserSchema.plugin(passportLocalMongoose);

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

这篇关于user.setPassword不是函数-护照本地猫鼬的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆