首页 > 解决方案 > 猫鼬忽略必需

问题描述

我有这个User架构:

email: {
    type: String,
    required: true
},
name: {
    type: String,
    required: true
},
password: {
    type: String,
    required: true
}

当您执行 POST ( /api/user-add) 时,我希望所有字段都是必需的。但是当我登录(/api/login)时,我只需要emailandpassword字段。我的问题是,在我的登录代码中,我最终得到了这个功能:

staffSchema.methods.generateToken = function(callback) {
    var token = jwt.sign(this._id.toHexString(), config.SECRET);

    this.token = token;
    this.save(function(err, staff) {
        if (err) return callback(err);
        callback(null, staff);
    });
}

在这里它会出错,因为该name字段是必需的。我该如何绕过这个。我正在寻找这样的东西,我假设:

    this.save(function(err, staff) {
        if (err) return callback(err);
        callback(null, staff);
    }).ignoreRequired('name');

标签: node.jsexpressmongoose

解决方案


当您使用令牌登录时,这是一个无需存储JWT即可生成token和验证的基本示例usertoken

笔记 :

验证用户而不存储token在数据库中的示例

*登录方式

const jwt = require('./jwt');
userCtr.authenticate = (req, res) => {
  const {
    email, password,
  } = req.body;

  const query = {
    email: email,
  };

  User.findOne(query)
    .then((user) => {
      if (!user) {
        //return error user not found.
      } else {
        if (passwordHash.verify(password, user.password)) { // verify password
            const token = jwt.getAuthToken({ id: user._id });
            const userData = _.omit(user.toObject(), ['password']); // return user data
            return res.status(200).json({ token, userData });
        }

        //return error password not match
      }
    })
    .catch((err) => {
    });
};

*jwt.js

const jwt = require('jwt-simple');
const logger = require('./logger');

const jwtUtil = {};

jwtUtil.getAuthToken = (data) => {
  return jwt.encode(data, process.env.JwtSecret);
};

jwtUtil.decodeAuthToken = (token) => {
  if (token) {
    try {
      return jwt.decode(token, process.env.JwtSecret);
    } catch (err) {
      logger.error(err);
      return false;
    }
  }
  return false;
};

module.exports = jwtUtil;

*使用中间件阻止其他路由访问

userRouter.post('/update-profile', middleware.checkUser, userCtr.updateProfile);

*middleWare.js

middleware.checkUser = (req, res, next) => {
  const { headers } = req;

  if (_.isEmpty(headers.authorization)) {
    //return error
  } else {
    const decoded = jwt.decodeAuthToken(headers.authorization.replace('Bearer ', ''));
    if (decoded) {
      User.findOne({ _id: decoded.id })
        .then((user) => {
          if (user) {
            req.user = user;
            next();
          } else {
            //error
          }
        })
        .catch((err) => {
          //errror
        });
      req.user = decoded;
    } else {
      //error
    }
  }
};

推荐阅读