Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

How to pass a Mongoose ObjectId to a previously schema called? #172

Open
jovi-tsx opened this issue Aug 28, 2019 · 0 comments
Open

How to pass a Mongoose ObjectId to a previously schema called? #172

jovi-tsx opened this issue Aug 28, 2019 · 0 comments

Comments

@jovi-tsx
Copy link

jovi-tsx commented Aug 28, 2019

Well, i'll try to be very clear since my english is not that good though. LOL.

I'm trying to create a person to create a user. My problem is: I have to instantiate my UserSchema to create NodeRestful Model and so the methods (get, post, etc.), but my UserSchema has a default value who receives by default a person objectId, 'cause I cannot have a user without have a person, right?

But, I only create a person right before user post action. BUT HOW I'LL INSTANTIATE USER WITHOUT HAVING A PERSON ID? I'M STUCK.

Check my code and try to understand yourselves.

routes.js

const express = require('express')

module.exports = function(server) {
    const router = express.Router()
    server.use('/api', router)

    const Board = require('../api/board/board-service')
    Board.register(router, '/boards')

    const User = require('../api/person/user/user-service')
    User.register(router, '/users')
}

user-service.js

const User = require('./user')
const errorHandler = require('../../common/errorHandler')

User.methods(['get', 'post', 'put'])
User.updateOptions({new: true, runValidators: true})

User.before('post', (req, res, next) => {
    const Person = require('../person')
    const newPerson = new Person({ name: req.body.name, email: req.body.email })
    
    newPerson.save(err => {
        if(err) errorHandler(err)
    })

    req.body.personId = newPerson._id
    next()
})

module.exports = User

user.js

const restful = require('node-restful')
const mongoose = restful.mongoose
const ObjectId = mongoose.Schema.Types.ObjectId
const bcrypt = require('bcrypt')

const utils = require('../../../utils')

const BCRYPT_WORK_FACTOR = 10

const userSchema = new mongoose.Schema({
    personId: { type: ObjectId, required: true, default: **req.body.personId** },
    initials: { type: String, required: true, default: utils.getInitials() },
    username: { type: String, required: true, unique: true, dropDups: true },
    password: { type: String, required: true }
})

userSchema.pre('save', function(next) {
    var user = this

    if(!user.isModified('password')) return next();
    
    bcrypt.genSalt(BCRYPT_WORK_FACTOR, function(err, salt) {
        if(err) return next(err);

        bcrypt.hash(user.password, salt, function(err, hash) {
            if(err) return next(err)

            user.password = hash
            next()
        })
    })
})

userSchema.methods.comparePassword = function(candidatePassword, cb) {
    bcrypt.compare(candidatePassword, this.password, function(err, isMatch) {
        if(err) return cb(err)
        cb(null, isMatch)
    })
}

module.exports = restful.model('User', userSchema)

person.js

const restful = require('node-restful')
const mongoose = restful.mongoose

const personSchema = new mongoose.Schema({
    name: { type: String, required: true },
    email: { type: String, required: true, unique: true, dropDups: true },
    biography: { type: String }
})

module.exports = mongoose.model('Person', personSchema)

Please guys, help me, i'm very lost.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant