【问题标题】:Node.js + mogoose validationNode.js + 猫鼬验证
【发布时间】:2017-08-03 06:52:30
【问题描述】:

我有以下用户授权路径代码:

var User = require('models/user').User;
var HttpError = require('error').HttpError;
var AuthError = require('models/user').AuthError;
var async = require('async');

exports.get = function(req, res) {
   res.render('lobby', {title: 'Lobby'});
};


exports.post = function(req, res, next) {
  var username = req.body.username;
  var password = req.body.password;


User.authorize(username, password, function (err, user) {
    if (err) {
        if (err instanceof AuthError) {
            return next(new HttpError(403, err.message));

        } else {
            return next(err);
        };
    };
    req.session.user = user._id;
    res.send({});
});

};

这是我的用户模型代码:

    var crypto = require('crypto');
    var async = require('async');
    var util = require('util');


    var mongoose = require('lib/mongoose'),
        Schema = mongoose.Schema;

    var schema = new Schema({
        username: {
            type: String,
            unique: true,
            required: true
        },
        hashedPassword: {
            type: String,
            required: true
        },
        salt: {
            type: String,
            required: true
        },
        created: {
            type: Date,
            default: Date.now
        }
    });




    schema.methods.encryptPassword = function(password) {
        return crypto.createHmac('sha1', this.salt).update(password).digest('hex');
    };


    schema.virtual('password')
        .set(function(password) {
            this._plainPassword = password;
            this.salt = Math.random() + '';
            this.hashedPassword = this.encryptPassword(password);
        })
        .get(function() { return this._plainPassword; });




    schema.methods.checkPassword = function(password) {
        return this.encryptPassword(password) === this.hashedPassword;
    };




    schema.statics.authorize = function(username, password, callback) {

        async.waterfall([
            function(callback) {
                User.findOne({username: username}, callback);
            },
            function(user, callback) {
                if (user) {
                    if (user.checkPassword(password)) {
                        callback(null, user);
                    } else {
                        callback(new AuthError("Wrong password"));
                    }
                } else {
                    callback(new AuthError("Username does not exist"));

                }
            }
        ], callback);
    };




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






    function AuthError(message) {
        Error.apply(this, arguments);
        Error.captureStackTrace(this, AuthError);

        this.message = message;
    }

    util.inherits(AuthError, Error);

    AuthError.prototype.name = 'AuthError';

    exports.AuthError = AuthError;

如果用户名应该是唯一的,如果不是,用户会收到“不是唯一的用户名”消息,如何创建用户注册路径。我是编程新手。

【问题讨论】:

    标签: javascript node.js validation mongoose


    【解决方案1】:

    我好像找到了答案。

    这是针对用户模型的:

            schema.pre("save",function(callback) {
            var self = this;
            async.waterfall([
                function(callback) {
                    mongoose.models["User"].findOne({username : self.username}, callback);
                },
                function(user, callback) {
                    if (user) {
                        callback(new AuthError("Wrong password"));
    
                    } else {
                        callback();
    
                    }
                }
            ], callback);
    
    
        });
    

    这是一个注册路径:

    var User = require('models/user').User;
    var HttpError = require('error').HttpError;
    var AuthError = require('models/user').AuthError;
    var async = require('async');
    
    exports.post = function(req, res, next) {
    var username = req.body.username;
    var password = req.body.password;
    
    
    var user = new User({username: username, password: password})
    user.save(function (err, user) {
        if (err) {
            if (err instanceof AuthError) {
                return next(new HttpError(403, err.message));
    
            } else {
                return next(err);
            };
        };
        req.session.user = user._id;
        res.send({});
    });
    

    }

    【讨论】:

      【解决方案2】:

      您可以使用此代码注册:如果您有任何问题,请告诉我!

      var User = require('models/user');
      app.post('/register',function(req,res){
          var username = req.body.username;
          var password = req.body.password;
      
      
          var user = new User({username: username, password: password})
       User.find({username: username},function(err,res){
          if (err) throw err;
          if(result != null)
           console.log("user exists");
      
          else
          {
            user.save(function (err, result) {
              if (err) throw err;
              console.log("show results: " + result);
      
            });
          }
       });
      });
      

      【讨论】:

        猜你喜欢
        • 2016-09-23
        • 2013-11-29
        • 2014-12-28
        • 2020-03-26
        • 1970-01-01
        • 1970-01-01
        • 2019-09-16
        • 2016-02-14
        • 1970-01-01
        相关资源
        最近更新 更多