2012-12-13 12 views
10

Sono nuovo di node.js e sto avendo problema di accesso al momento dello schema mangusta multipla erano dichiarare.cant ottenere i dati dal database dopo più schemi dichiarato (mangusta + express + mongodb

//schema.js nel modello

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

//User Schema 
var userSchema = new Schema({ 
id: ObjectId, 
firstname: {type: String, require: true}, 
lastname: {type: String, require: true}, 
username: {type: String, unique: true, require: true}, 
password: {type: String, require: true}, 
role: {type: [String], require: true} 
}) 

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

//Question Schema 
var qnSchema = new Schema({ 
id: ObjectId, 
question: {type: String, require: true}, 
module_id: {type: ObjectId, ref: 'Module'} 
}) 

var Question = mongoose.model('Question', qnSchema); 
module.exports = Question; 

//Answer Schema 
var ansSchema = new Schema({ 
id: ObjectId, 
answer: String, 
question: {type: ObjectId, ref: 'Question'} 
}) 

var Answer = mongoose.model('Answer', ansSchema); 
module.exports = Answer; 

//Module Schema 
var modSchema = new Schema({ 
id: ObjectId, 
name: {type: String, require: true} 
}) 

var Module = mongoose.model('Module', modSchema); 
    module.exports = Module; 

//Role Schema 
var roleSchema = new Schema({ 
id: ObjectId, 
role: {type: String, require: true} 
}) 

var Role = mongoose.model('Role', roleSchema); 
module.exports = Role; 

//index.js nel controllore

var mongoose = require('mongoose'); 
var User = require('../models/schema'); 
var db = mongoose.connect('mongodb://localhost/damai'); 

module.exports = function(app) { 

app.get('/', function(req, res) { 
    if (typeof req.session.userid == 'undefined') { 
     res.render('login', { title: app.get('title') });   
    } else { 
     res.render('index', { title: app.get('title') });  
    } 
}); 

app.post('/login', function(req, res) { 
    passwordVerification(req, res); 
}); 
} 

function passwordVerification(req, res) 
{ 
var userid = req.param('userid'); 
var password = req.param('password'); 
User.findOne({'username': userid},{'password': 1}, function(err, cb) 
{ 
    console.log(cb); 
    if(cb!= null) 
    { 
     if (password == cb.password) { 
      req.session.userid = userid; 
      res.render('index', { title: app.get('title'), 'userid': userid }); 
     } else { 
      res.render('login', { title: app.get('title'), error: 'Invalid login'}); 
     } 
    } 
    else 
    { 
     res.render('login', { title: app.get('title'), error: 'Invalid login'}); 
    } 
}); 
} 

Quando ho solo il "schema utente" nelle mie schema.js, la chiamata database da metodo "passwordVerification()" dall'indice .js tornerà urmi la password pertinente che è stata recuperata dal database. Tuttavia, quando inizio ad aggiungere in altri schemi come "Schema domanda" in schema.js, il metodo "passwordVerification()" restituirà sempre null.

+0

quando ho solo dichiarare userSchema, posso recuperare i dati dalla tabella utente. Tuttavia, quando aggiungo il file qnSchema, non posso recuperare i dati dalla tabella utente e restituisco solo null –

+0

Ho modificato la domanda. Spero che tu sia in grado di capire il problema. Scusa per il cattivo inglese –

+0

Continui a sovrascrivere 'exports.module' in schema.js e index.js non' require' schema.js. È questo il codice che stai correndo? – JohnnyHK

risposta

26

Quando si esportano più modelli da un singolo file come se si fosse in schema.js, è necessario assegnare a ciascun modello esportato il proprio nome di campo exports.

Ad esempio, sostituire il multiplo module.exports = ... linee in schema.js con questo codice alla fine del file che esporta tutti i modelli:

module.exports = { 
    User: User, 
    Question: Question, 
    Answer: Answer, 
    Module: Module, 
    Role: Role 
}; 

E poi nel index.js è possibile accedere i modelli in questo modo :

var models = require('./schema'); 
... 
models.User.findOne(... 
+0

Grazie mille! funziona come un fascino! –

+0

Stai utilizzando lo stesso modello per chiamare tutti i modelli? –

+0

In realtà ho lo stesso caso ma non funziona. WebModel non è un costruttore –