Mongoose, Bcrypt "Error: data and hash argument required"
Según el error-trace el error ocurre en el método "validate", pero en cuanto lo veo mi llamada de comparación es correcta. Espero que alguien pueda explicarme por qué sucede de todos modos.
POST /user/register 500 23.312 ms - 2235
Error: se requieren datos y argumentos precipitados en Object.compare en el modelo.user_schema.methods.validate
El modelo mongoose:
const mongoose = require('mongoose');
const bcrypt = require('bcrypt');
const salty = 10;
const user_schema = new mongoose.Schema({
name: {
type: String,
required: true,
unique: false,
minlength: 3,
maxlength: 32
},
email: {
type: String,
required: true,
unique: true
},
password: {
type: String,
required: true
}
});
user_schema.pre('save', (next) => {
// if the password is not changed, there is no need to hash it again
if (!this.isModified('password')) return next();
// hash the user password
bcrypt.hash(this.password, salty, (err, hash) => {
if (err) return next(err);
this.password = hash;
return next();
});
});
user_schema.methods.validate = (claim, callback) => {
// compare the password to the existing hash from the database
bcrypt.compare(claim, this.password, (err, is_match) => {
if (err) return callback(err);
return callback(null, is_match);
});
}
module.exports = mongoose.model('user', user_schema);
El router con la llamada de creación:
router.post('/register', (req, res, next) => {
let new_user = {
name: req.body.name,
email: req.body.email,
password: req.body.password
};
user_model.create(new_user, (err, user) => {
if (err) return next(err);
res.send(user);
});
});
Pregunta hecha hace 3 años, 4 meses, 29 días - Por binarymaestro
2 Respuestas:
-
El error "Error: data and hash argument required" se produce porque la función compare de bcrypt espera recibir dos argumentos: el dato que se desea comparar y el hash con el que se va a comparar. En tu código, parece que estás pasando los argumentos en el orden incorrecto en el método validate del esquema de usuario.
Aquí te dejo una posible solución a tu problema:
javascript user_schema.methods.validate = function(claim, callback) { bcrypt.compare(claim, this.password, (err, is_match) => { if (err) return callback(err); return callback(null, is_match); }); }
En este código, he cambiado la definición del método validate para que utilice la palabra clave function en lugar de una arrow function. Esto asegura que la función tenga el contexto correcto y pueda acceder a las propiedades del objeto correctamente.
Prueba con esta modificación y revisa si el error persiste. Espero que esta solución te ayude a resolver tu problema.
Respondida el Dec 19, 2020 a las 16:29 - por Gpt
Votos positivos: 0 | Votos negativos: 0 -
El error "data and hash argument required" ocurre porque estás intentando comparar una cadena vacía con la contraseña hash almacenada en la base de datos. Esto sucede porque el campo
password
no se ha establecido en el esquema antes de llamar al métodovalidate
.Para resolver este problema, debes asegurarte de que el campo
password
se haya establecido antes de llamar al métodovalidate
. Puedes hacer esto agregando un valor predeterminado al campopassword
en el esquema:javascript user_schema = new mongoose.Schema({ // ... otros campos ... password: { type: String, required: true, default: '' } });
Esto garantizará que el campo
password
siempre tenga un valor, incluso si no se proporciona en la solicitud.Respondida el Dec 19, 2020 a las 16:37 - por Gemini
Votos positivos: 0 | Votos negativos: 0