2016-04-27 6 views
1

Я пытаюсь использовать модель («цель») в моем классе модели «как» (ниже). Однако каждый раз, когда я запускаю экземпляр узла, он говорит, что Goal.findById не является функцией.Сначала загрузите определенные модели mongoose

После запуска console.log (номер) в каждой модели я обнаружил, что они загружаются очень странно и из-за порядка, который мне нужен/нужен.

Мне было интересно, как я могу загружать модели перед другими или устанавливать определенный порядок загрузки для моделей?

var mongoose = require('mongoose'); 
var Schema = mongoose.Schema; 
var User = require('../models/user.js'); 
var Goal = require('../models/goal.js'); 

var likeSchema = new Schema({ 
userPosted: { 
    type: Number, 
    ref: 'user', 
    required: true 
}, 
goal: { 
    type: Number, 
    ref: 'goal', 
    required: true 
}}, 
{ 
    timestamps: true 
}); 

likeSchema.post('save', function (doc, next) { 
    var goalID = doc.goal; 

Goal.findOne({'_id': doc.goal}, function(err, goal) { 
    goal.likes.push(doc._id); 
    goal.save(); 
    User.findById(doc.userPosted, function(err, user) { 
     user.likedPosts.push(goalID); 
     user.save(); 
     next(); 
    }); 
}); 
}); 

likeSchema.post('remove', function(doc) { 
    Goal.findById(doc.goal, function(err, goal) { 
     goal.likes.pull(doc._id); 
     goal.save(); 

     User.findById(doc.userPosted, function(err, user) { 
     user.likedPosts.pull(goal._id); 
     user.save(); 
     }); 
    }); 
}); 

console.log("4"); 

module.exports = mongoose.model('like', likeSchema); 

Ошибка:

TypeError: Goal.findOne is not a function at model.<anonymous> (E:\Project\like.js:28:10) 

** Edit: ** goal.js

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

var autoIncrement = require('mongoose-auto-increment'); 
var User = require('../models/user.js'); 
var Like = require('../models/like.js'); 

var goal = new Schema({ 
    user: { 
     type: Number, 
     ref: 'user', 
     required: true 
    }, 
    user_name: { 
     type: String, 
     required: true 
    }, 
    title: { 
     type: String, 
     required: true, 
     trim: true 
    }, 
    description: { 
     type: String, 
     default: undefined, 
     trim: true 
    }, 
    location: { 
     type: String, 
     default: undefined 
    }, 
    likes: [{ 
     type: Schema.ObjectId, 
     ref: 'like' 
    }], 
    comments: [{ 
     type: Schema.ObjectId, 
     ref: 'comment' 
    }], 
    updates: [{ 
     type: Schema.ObjectId, 
     ref: 'update' 
    }], 
    created: { 
     type: Date, 
     default: Date.now 
    }, 
    cover_image: { 
     type: String, 
     default: undefined 
    }, 
    complete_by: { 
     type: String, 
     default: "Death" 
    }, 
    completed: { 
     type: Boolean, 
     default: false 
    }, 
    completedDate: { 
     type: String, 
     default: undefined 
    }, 
    url: { 
     type: String, 
     default: undefined 
    }, 
    sponsor: { 
     type: String, 
     default: undefined 
    }, 
    private: { 
     type: Boolean, 
     default: false 
    } 
}); 

goal.plugin(autoIncrement.plugin, 'goal'); 

goal.pre('save', function (next) { 
    this.wasNew = this.isNew; 
    next(); 
}); 

goal.post('save', function (doc) { 
    if (this.wasNew) { 
     User.findById(doc.user, function (err, user) { 
      user.goals.push(doc._id); 
      user.save(); 
     }); 
    } 
}); 

goal.post('remove', function(doc) { 
    //TODO: Removes like objects/user profile/anything containing the goal 
    User.findById(doc.user, function(err, user) { 
     user.goals.pull(doc._id); 
     user.save(); 
    }); 

    Like.find({ 
    'goal': doc._id 
    }).remove(function(err, removed) { 
    if(err) { 
     console.log("ERROR?"); 
     return; 
    } 
    console.log('removed likes - ' + removed); 
    }); 
});  

module.exports = mongoose.model('goal', goal); 
+0

Вы правильно «экспортировали» файл goal.js в качестве модуля? –

+0

@NidhinDavid о да. извините, я не включил это, но у меня есть. – Nick

+0

Перед тем, как попытаться их использовать, необходимо убедиться, что все модели определены. Можете ли вы показать код цели.js? – Molda

ответ

0

Я думаю, что ваш likeschema будет что-то вроде этого -

var likeSchema = new Schema({ 
userPosted: { 
    type: Number, 
    ref: 'User', 
    required: true 
}, 
goal: { 
    type: Number, 
    ref: 'Goal', 
    required: true 
}}, 
{ 
    timestamps: true 
}); 

Если это не работает, можете ли вы показать свой код для модели Goal?

+0

Привет, извините, я действительно не прояснил свои недостатки. – Nick

+0

Ошибка на самом деле в пред и post middlewares, где говорится, что Goal.findOne не является функцией. Я нашел это потому, что модель цели еще не загружена. – Nick