2016-04-27 13 views
1

Ich versuche, ein Modell ("Ziel") in meiner "like" -Modellklasse (Code unten) zu verwenden. Bei jedem Start der Knoteninstanz heißt es jedoch, dass Goal.findById keine Funktion ist.Laden Sie spezifische Mungo-Modelle zuerst

Nach dem Ausführen einer console.log (Nummer) in jedem Modell, fand ich, dass sie sehr seltsam laden und aus der Reihenfolge, die ich möchte/brauchen.

Ich frage mich, wie ich Modelle vor anderen laden oder eine bestimmte Ladereihenfolge für Modelle festlegen kann?

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); 

Fehler:

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

Haben Sie die Datei goal.js korrekt als Modul 'exportiert'? –

+0

@NidhinDavid oh ja. Entschuldigung, ich habe das nicht erwähnt, aber ich habe es getan. – Nick

+0

Sie müssen sicherstellen, dass alle Modelle definiert sind, bevor Sie versuchen, sie zu verwenden. Können Sie den Code von goal.js anzeigen? – Molda

Antwort

0

Ich denke, Ihr likeschema etwas so sein würde -

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

Wenn es funktioniert nicht, kannst du bitte Zeigen Sie Ihren Code für Goal Modell?

+0

Hallo, Entschuldigung, ich habe es nicht wirklich klar gemacht. – Nick

+0

Der Fehler ist eigentlich in der Pre-und Post-Middlewares, wo es Goal.findOne sagt, ist keine Funktion. Ich fand dies, weil das Goal-Modell noch nicht geladen wurde. – Nick

Verwandte Themen