Home > Mobile >  Getting error data and salt arguments required on bcrypt?
Getting error data and salt arguments required on bcrypt?

Time:09-21

I am trying to save a user to MongoDB as follows, but I am getting the error bcrypt Error: data and hash arguments required. I have checked the same error question asked by other Dev on StackOverflow but it doesn't help. I have attached the codes of the model file and router file.

  1. User Model file
const mongoose = require('mongoose');
const bcrypt = require('bcrypt');

const uSchema = new mongoose.Schema({
    fullName: {
        type: String,
        required: true,
        min: 4,
        max: 30
    },
    email: {
        type: String,
        required: true,
        trim: true,
        unique: true,
        index: true
    },
    hash_password: {
        type: String,
        required: true,
        min: 6,
        max: 12
    },
    role: {
        type: String,
        enum: ['user', 'admin', 'moderator'],
        default: 'admin'
    }
}, { timestamps: true });

uSchema.virtual('password')
    .set(function (password) {
        this.hash_password = bcrypt.hashSync(password, 10);
    });

uSchema.methods = {
    authenticate: function (password) {
        return bcrypt.compareSync(password, this.hash_password);
    }
}


module.exports = mongoose.model('User', uSchema);

  1. User Router file
const express = require('express');
const router = express.Router();
const User = require('../models/user.model');

router.post('/login', (req, res) => {

});

router.post('/signin', (req, res) => {
    User.findOne({ email: req.body.email })
        .exec((error, user) => {
            if (user) return res.status(400).json({
                message: 'User already exists.'
            });

            const {
                fullName,
                email,
                password
            } = req.body;

            const _user = new User({
                fullName,
                email,
                password
            });

            _user.save((error, data) => {
                if (error) {
                    return res.status(400).json({
                        message: 'Something went wrong'
                    });
                } if (data) {
                    return res.status(201).json({
                        user: data
                    })
                }
            })
        });
});

module.exports = router;

CodePudding user response:

You can do it in the router file instead.

const bcrypt = require("bcrypt")

// ...

router.post('/signin', (req, res) => { // Change this to signup
    User.findOne({ email: req.body.email })
        .exec((error, user) => {
            if (user) return res.status(400).json({
                message: 'User already exists.'
            });

            const {
                fullName,
                email,
                password
            } = req.body;

            const hashedPassword = bcrypt.hashSync(password, 10);

            const _user = new User({
                fullName,
                email,
                hashedPassword
            });

            _user.save((error, data) => {
                if (error) {
                    return res.status(400).json({
                        message: 'Something went wrong'
                    });
                } if (data) {
                    return res.status(201).json({
                        user: data
                    })
                }
            })
        });
});

module.exports = router;

and delete the password virtual from the model.

  • Related