Нахождение _id пользователя, только что созданного в маршруте - PullRequest
0 голосов
/ 18 февраля 2019

Я делаю быстрый прототип приложения MERN, у меня есть внутренний вопрос: у меня есть модель User и модель Category, когда пользователь регистрируется, мне нужно заполнить модель категории некоторой базовой информацией, экспортированной изобъект, который пользователь может редактировать позже.Я хотел бы назначить каждой категории ссылку на только что созданный идентификатор учетной записи.Проблема в том, что я не понимаю, как я могу получить только что созданный идентификатор пользователя.Вот мой маршрут (да, это не рефакторинг, извините):

// @route   POST api/users/register
// @desc    Register user
// @access  Public
router.post('/register', (req, res)=>{
    //Validate req.body
    const {errors, isValid} = validateRegisterInput(req.body);
    //Check validation 
    if(!isValid){
        return res.status(400).json(errors); 
    }

    User.findOne({ email: req.body.email })
        .then(user => {
            if(user){
                errors.email = 'Email already exists';
                return res.status(400).json(errors)
            } else {
                const avatar = gravatar.url(req.body.email, {
                    s: '200', //Size
                    r: 'pg',  //Rating
                    d: 'mm'   //Default
                });
                const newUser = new User({
                    name: req.body.name,
                    email: req.body.email,
                    avatar,
                    password: req.body.password
                });
                //Hash the password and save
                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))
                    })
                });
                //Fill user categories with default categories
                defaultIcons.map((icon) => {
                    const newCategory = new Category ({
                        name: icon.name,
                        type: icon.type,
                        icon: icon.icon
                    })
                    newCategory.save();
                });
            }
        })
});    

А это схема категории:

//Create Schema
const CategorySchema = new Schema({
    //Every account is associated with actual User schema by id
    user: {
        type: Schema.Types.ObjectId,
        ref: 'users'
    },
    name: {
        type: String,
        required: true
    },
    type: {
        type: String,
        required: true
    },
    icon: {
        type: String,
        required: true
    }
})

Каково было бы лучшее решение для этого?Лучше ли иметь отдельную схему для категорий, как я делаю, или я могу реализовать поле массива объектов в схеме пользователя?

1 Ответ

0 голосов
/ 18 февраля 2019

В той части, где вы делаете

if(err) throw err;
    newUser.password = hash;
    newUser.save()
        .then(user => res.json(user))
        .catch(err => console.log(err))

, у вас есть user в вашем решенном обещании.Вы можете просто

const newCreatedUserID = user._id

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...