2016-04-30 52 views
0

我剛剛開始使用MEAN堆棧,似乎無法讓我的對象標識在多個模式之間共享。Nodejs,Mongoose,Express:type:Schema.ObjectId,ref:'Account'not working

簡而言之:我希望帳號模型中的對象ID作爲對象ID存儲在我的個人資料模型中。

我正在使用localpassport身份驗證。以下是我的App.js文件,路線和模型。

在此先感謝您的幫助。

App.js

var express = require('express'); 
var path = require('path'); 
var favicon = require('serve-favicon'); 
var logger = require('morgan'); 
var cookieParser = require('cookie-parser'); 
var bodyParser = require('body-parser'); 
var mongoose = require('mongoose'); 
var session = require('express-session'); 
var passport = require('passport'); 
var LocalStrategy = require('passport-local').Strategy; 

var routes = require('./routes/index'); 
var users = require('./routes/users'); 

var app = express(); 

// view engine setup 
app.set('views', path.join(__dirname, 'views')); 
app.set('view engine', 'jade'); 

// uncomment after placing your favicon in /public 
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico'))); 
app.use(logger('dev')); 
app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({ extended: false })); 
app.use(cookieParser()); 
app.use(session({ 
    secret: 'keyboard cat', 
    resave: false, 
    saveUninitialized: false 
})); 
app.use(passport.initialize()); 
app.use(passport.session()); 
app.use(express.static(path.join(__dirname, 'public'))); 

app.use('/', routes); 
var Profile = require('./models/profile'); 
var Account = require('./models/account'); 
passport.use(new LocalStrategy(Account.authenticate())); 
passport.serializeUser(Account.serializeUser()); 
passport.deserializeUser(Account.deserializeUser()); 

mongoose.connect('mongodb://127.0.0.1:27017/myapp'); 


// catch 404 and forward to error handler 
app.use(function(req, res, next) { 
    var err = new Error('Not Found'); 
    err.status = 404; 
    next(err); 
}); 

// error handlers 

// development error handler 
// will print stacktrace 
if (app.get('env') === 'development') { 
    app.use(function(err, req, res, next) { 
    res.status(err.status || 500); 
    res.render('error', { 
     message: err.message, 
     error: err 
    }); 
    }); 
} 

// production error handler 
// no stacktraces leaked to user 
app.use(function(err, req, res, next) { 
    res.status(err.status || 500); 
    res.render('error', { 
    message: err.message, 
    error: {} 
    }); 
}); 


module.exports = app; 

Index.js

var express = require('express'); 
var passport = require('passport'); 
var Account = require('../models/account'); 
var Profile = require('../models/profile'); 
var router = express.Router(); 

/* GET home page. */ 
router.get('/', function(req, res, next) { 
    res.render('index', { user : req.user }); 
}); 

router.get('/register', function(req, res) { 
    res.render('register', { }); 
}); 

router.post('/register', function(req, res) { 
    Account.register(new Account({ username : req.body.username }), req.body.password, function(err, account) { 
    if (err) { 
     return res.render('register', { account : account }); 
    } 

    passport.authenticate('local')(req, res, function() { 
     res.redirect('/'); 
    });   
    }); 
}); 

router.get('/login', function(req, res) { 
    res.render('login', { user : req.user }); 
}); 

router.post('/login', passport.authenticate('local'), function(req, res) { 
    res.redirect('/profile'); 
}); 

router.get('/logout', function(req, res) { 
    req.logout(); 
    res.redirect('/'); 
}); 

router.get('/profile', function(req, res, next) { 
    res.render('profile', { user : req.user}); 
}); 

router.post('/profile', function(req, res) { 
    var basicProfile = new Profile(); 

    basicProfile.firstname = req.body.firstname, 
    basicProfile.middlename = req.body.middlename, 
    basicProfile.lastname = req.body.lastname, 
    basicProfile.contactinfo.phonenumber = req.body.phonenumber, 
    basicProfile.contactinfo.address.street = req.body.street, 
    basicProfile.contactinfo.address.city = req.body.city, 
    basicProfile.contactinfo.address.state = req.body.state, 
    basicProfile.contactinfo.address.zip = req.body.zip 

    basicProfile.save(function(err, profile){ 
     if(err){ 
     return res.render('profile', { profile : profile }); 
     } 
     return res.redirect('/'); 
    }); 
}); 

router.get('/ping', function(req, res) { 
    res.status(200).send("pong!"); 
}); 

router.get('/profile', function(req, res) { 
    res.render('profile') 
}) 

module.exports = router; 

帳戶型號

var mongoose = require('mongoose'); 
var Schema = mongoose.Schema; 
var passportLocalMongoose = require('passport-local-mongoose'); 

var Account = new Schema({ 
    username: String, 
    password: String 
}); 

Account.plugin(passportLocalMongoose); 

module.exports = mongoose.model('Account', Account); 

剖面模型

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

var ProfileSchema = new Schema({ 
    _creator: [{type: mongoose.Schema.Types.ObjectId, ref: 'Account'}], 

    firstname: String, 
    middlename: String, 
    lastname: String, 
    contactinfo: { 
     phonenumber: String, 
     address: { 
      street: String, 
      city: String, 
      state: String, 
      zip: String 
     } 
    } 

}); 


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

你有問題的具體問題嗎?您發佈了所有代碼,但完全不清楚您已嘗試關聯兩種模型,以及爲何失敗。 – robertklep

+0

代碼運行時,它添加到我的db.profile集合中,但「_creator」顯示爲空數組。所以,它從來沒有註冊帳戶模型的ObjectId,我不知道爲什麼。根據貓鼬文檔它應該是一個簡單的引用,如我在代碼中,但它只是返回一個空的數組。我不知道我錯過了什麼。 – ODYodel

+0

你在哪裏關聯一個賬戶到代碼中的一個配置文件?這是很難跟隨代碼與所有額外的噪音:-( – robertklep

回答

0

Profile.js

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

var ProfileSchema = new Schema({ 
    _creator: [{type: mongoose.Schema.Types.ObjectId, ref: 'Account'}], 

    firstname: String, 
    middlename: String, 
    lastname: String, 
    contactinfo: { 
     phonenumber: String, 
     address: { 
      street: String, 
      city: String, 
      state: String, 
      zip: String 
     } 
    } 

}); 


module.exports = mongoose.model('Profile', ProfileSchema); 

Index.js

var express = require('express'); 
var passport = require('passport'); 
var Account = require('../models/account'); 
var Profile = require('../models/profile'); 
var router = express.Router(); 

/* GET home page. */ 
router.get('/', function(req, res, next) { 
    res.render('index', { user : req.user }); 
}); 

router.get('/register', function(req, res) { 
    res.render('register', { }); 
}); 

router.post('/register', function(req, res) { 
    Account.register(new Account({ username : req.body.username }), req.body.password, function(err, account) { 
    if (err) { 
     return res.render('register', { account : account }); 
    } 

    passport.authenticate('local')(req, res, function() { 
     res.redirect('/'); 
    });   
    }); 
}); 

router.get('/login', function(req, res) { 
    res.render('login', { user : req.user }); 
}); 

router.post('/login', passport.authenticate('local'), function(req, res) { 
    res.redirect('/profile'); 
}); 

router.get('/logout', function(req, res) { 
    req.logout(); 
    res.redirect('/'); 
}); 

router.get('/profile', function(req, res, next) { 
    res.render('profile', { user : req.user}); 
}); 

router.post('/profile', function(req, res) { 
    var basicProfile = new Profile(); 

    basicProfile._creator = req.user._id 
    basicProfile.firstname = req.body.firstname, 
    basicProfile.middlename = req.body.middlename, 
    basicProfile.lastname = req.body.lastname, 
    basicProfile.contactinfo.phonenumber = req.body.phonenumber, 
    basicProfile.contactinfo.address.street = req.body.street, 
    basicProfile.contactinfo.address.city = req.body.city, 
    basicProfile.contactinfo.address.state = req.body.state, 
    basicProfile.contactinfo.address.zip = req.body.zip 

    basicProfile.save(function(err, profile){ 
     if(err){ 
     return res.render('profile', { profile : profile }); 
     } 
     return res.redirect('/'); 
    }); 
}); 

router.get('/ping', function(req, res) { 
    res.status(200).send("pong!"); 
}); 

router.get('/profile', function(req, res) { 
    res.render('profile') 
}) 

module.exports = router; 

新增_creator從數據庫中針對用戶標識的路線現在聯營該對象id到用戶配置文件模式。

如果有人閱讀本文,請參閱此答案的問題,請評論並告訴我。 I.E.安全問題的關鍵,可擴展性,查詢等。

感謝和感謝robertklep讓我失望的道路。