简体   繁体   中英

Mongoose TypeError: object is not a function when instantiating object of a schema type

the issue i'm having is that mongoose isn't letting me instantiate an object of a schema type, inside a 'pre' method, of a different schema.

I've got 2 schemas - 'User' and 'Tickit'.

User.js

var mongoose = require('mongoose');
var bcrypt   = require('bcrypt-nodejs');
var Schema   = mongoose.Schema;
var Tickit   = require('../models/Tickit');

var userSchema = new Schema({
    email        : String,
    password     : String,
    tickits      : [Tickit.tickitSchema]

});

userSchema.methods.generateHash = function(password) {
    return bcrypt.hashSync(password, bcrypt.genSaltSync(8), null);
};

userSchema.methods.validPassword = function(password) {
    return bcrypt.compareSync(password, this.password);
};

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

and Tickit.js

var mongoose    = require('mongoose');
var User        = require('../models/User');
var Schema      = mongoose.Schema;
var tickitSchema = new Schema({
    title: String,
    description: String,
    author : { type: Schema.Types.ObjectId, ref: 'User' },
    comments: [{body:"string", by: mongoose.Schema.Types.ObjectId}]
});

tickitSchema.pre('save', function(next){

    var user = new User();
    user.tickits.push ({id:this._id});
    user.save(function(err){
        if(err)
            res.send(err)

            .populate('tickits')

            .exec(function(err, blah){
                if(err) res.send(err);
            })
        res.json(blah); 
    })
    next();
})
module.exports = mongoose.model('Tickit', tickitSchema);

What i'm trying to do with the pre method in Tickit is populate the 'Tickits' array in the User schema with the id of that Tickit every time a Tickit is created.

However in my app when I do create a tickit, the app crashes and I get this error

var user = new User();
        ^

TypeError: object is not a function

Try to define user inside your function:

tickitSchema.pre('save', function(next){

   var User = require('../models/User');    

   // Code

});

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM