Ошибка Bcrypt при сохранении пользователя в mongoose - PullRequest
0 голосов
/ 08 сентября 2018

на данный момент я следую учебному пособию, чтобы подтолкнуть себя в узел тем + реагировать.

Ссылка на репо: https://bitbucket.org/grtn/cloudstruct/src/develop/

Когда я делаю запрос на публикацию в / api / users / register, я получаю следующую ошибку в консоли и не могу понять, почему.

/Users/****/Dev/cloudstruct/routes/api/users.js:38
                        if(err) throw err;
                                ^

Error: Illegal arguments: undefined, string
    at _async (/Users/****/Dev/cloudstruct/node_modules/bcryptjs/dist/bcrypt.js:214:46)
    at Object.bcrypt.hash (/Users/****/Dev/cloudstruct/node_modules/bcryptjs/dist/bcrypt.js:220:13)
    at bcrypt.genSalt (/Users/****/Dev/cloudstruct/routes/api/users.js:37:28)
    at Immediate.<anonymous> (/Users/****/Dev/cloudstruct/node_modules/bcryptjs/dist/bcrypt.js:153:21)
    at runCallback (timers.js:756:18)
    at tryOnImmediate (timers.js:717:5)
    at processImmediate [as _immediateCallback] (timers.js:697:5)
[nodemon] app crashed - waiting for file changes before starting...

Пользовательская модель выглядит следующим образом:

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

// Create Schema
const UserSchema = new Schema({
    name:{
        type: String,
        required: true
    },
    email:{
        type: String,
        required: true
    },
    password:{
        type: String,
        required: true
    },
    avatar:{
        type: String
    },
    date:{
        type: Date,
        default: Date.now
    }
});

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

И мой маршрут:

const express = require ('express');
const router = express.Router();
const gravatar = require('gravatar');
const bcrypt = require('bcryptjs');

// Load User model
const User = require ('../../models/User')

//@route    GET api/users/test
//desc      Tests post route
//@access   Public
router.get('/test', (req, res) => res.json({msg: '<h1>Hello World</h1>'}));

//@route    POST api/users/register
//desc      Register User
//@access   Public
router.post('/register', (req, res) =>{
    User.findOne({ email: req.body.email })
        .then(user => {
            if(user) {
                return res.status(400).json({email: 'Email already exists'});
            } else {
                const avatar = gravatar.url(req.body.email, {
                    s: '200',
                    r: 'pg',
                    d: 'mm'
                });

                const newUser = new User({
                    name: req.body.name,
                    email: req.body.email,
                    avatar: avatar,
                    password: req.body.password
                });

                bcrypt.genSalt(10, (err, salt) => {
                    bcrypt.hash(newUser.password, salt, (err, hash) => {
                        if(err) throw err;
                        newUser.password = hash;
                        newUser
                            .save()
                            .then(user => res.json(user))
                            .catch(err => console.log(err));
                    })
                });
            }
        });
});

module.exports = router;

Спасибо за вашу помощь!

Ответы [ 2 ]

0 голосов
/ 08 сентября 2018

Правильный способ хэширования паролей с помощью Mogoose - использовать presave middleware . Это даст вам гарантию того, что пароль пользователя будет всегда хешироваться независимо от того, где вы хотите создать запись пользователя. Кроме того, это лучше для архитектуры: хеширование будет производиться на уровне данных вместо маршрутизации.

Здесь является хорошим примером. Промежуточное программное обеспечение описано в шаге 2.

0 голосов
/ 08 сентября 2018

Ваш newUser.password не определен. Я боюсь, что мы можем получить доступ к документам Мангуста, как это. Решением в этом случае является использование req.body.password в .hash ()

Для справки: если вы хотите получить доступ к значению ключа документа mongoose, вам нужно проанализировать документ в формате JSON.

...