У меня есть эта схема User:
email: {
type: String,
required: true
},
name: {
type: String,
required: true
},
password: {
type: String,
required: true
}
Когда вы выполняете POST (/api/user-add), я хочу, чтобы все поля были обязательными. Но когда я выполняю вход (/api/login), мне нужны только поля email и password. Моя проблема в том, что в моем коде входа я в конце концов добираюсь до этой функции:
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');
Потому что вам нужно сохранить сгенерированный токен, или что вы предложите?
Пожалуйста, добавьте новую коллекцию для токена магазина - это хорошая практика
Если вам нужен пример, я могу вам предоставить?
Да, пожалуйста, это было бы полезно :)
Почему save? Вам нужно использовать findOneAndUpdate в поле token. @FreddyBonda





Когда вы входите в систему с использованием токена JWT, это основной пример для создания token и аутентификации user без сохранения token.
Примечание :
Example to authenticate the user without store
tokenin DB
* Метод входа в систему
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
}
}
};
Довольно сложная штука для меня, ха-ха, но я благодарю тебя, друг!
Почему вы вызываете save () при входе в систему ()