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étodo validate.

    Para resolver este problema, debes asegurarte de que el campo password se haya establecido antes de llamar al método validate. Puedes hacer esto agregando un valor predeterminado al campo password 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