#node.js #mongodb #mongoose #mongoose-schema #mongoose-populate
#node.js #mongodb #mongoose #mongoose-schema #mongoose-заполнить
Вопрос:
Я создаю приложение для онлайн-курса. Я создал схему для регистрации пользователя. В схеме я также хочу добавить название курсов, на которые зарегистрировался пользователь. Название курса — массив. Регистрация пользователя прошла успешно. после этого я создал маршрут для / dashboard, куда пользователь отправляет POST-запрос для добавления названия курса. Этот курс должен быть добавлен в то же поле схемы регистрации для зачисленного курса. Однако, когда я сохраняю новый объект схемы регистрации, он создает новое поле поля документа courseEnrolled. Я хочу, чтобы это значение POST-запроса добавлялось в поле документа пользователя, конечно, в виде массива.
Вот как я определил свою схему регистрации. Его имя в account.js
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var passportLocalMongoose = require('passport-local-mongoose');
var courseSchema = new Schema({ courseName : String });
var Account = new Schema({
username: {
type: String,
unique: true
},
password: String,
email: String,
firstName: String,
lastName: String,
courseEnrolled: [{courseName : String}]
});
Account.plugin(passportLocalMongoose);
module.exports = mongoose.model('Account', Account);
Вот моя паспортная регистрация . register.js
var passport = require('passport');
var LocalStrategy = require('passport-local').Strategy;
var User = require('../models/account');
var bCrypt = require('bcrypt-nodejs');
var course = require('../models/courseEnrollment');
module.exports = function(passport){
passport.use('register', new LocalStrategy({
passReqToCallback : true // allows us to pass back the entire request to the callback
},
function(req, username, password, done) {
findOrCreateUser = function(){
// find a user in Mongo with provided username
User.findOne({ 'username' : username }, function(err, user) {
// In case of any error, return using the done method
if (err){
console.log('Error in SignUp: ' err);
return done(err);
}
// already exists
if (user) {
console.log('User already exists with username: ' username);
return done(null, false, req.flash('message','User Already Exists'));
} else {
// if there is no user with that email
// create the user
var newUser = new User();
var newCourse = new course();
// set the user's local credentials
newUser.username = username;
newUser.password = createHash(password);
newUser.email = req.body.email;
newUser.firstName = req.body.firstName;
newUser.lastName = req.body.lastName;
newUser.courseEnrolled = req.body.courseEnrolled;
// save the user
newUser.save(function(err) {
if (err){
console.log('Error in Saving user: ' err);
throw err;
}
console.log('User Registration succesful');
return done(null, newUser);
});
}
});
};
// Delay the execution of findOrCreateUser and execute the method
// in the next tick of the event loop
process.nextTick(findOrCreateUser);
})
);
// Generates hash using bCrypt
var createHash = function(password){
return bCrypt.hashSync(password, bCrypt.genSaltSync(10), null);
}
}
Я могу успешно зарегистрировать пользователя. После этого у меня есть маршрут для /dashboard, где я обрабатываю запрос POST для добавления курса.
Вот фрагмент моего запроса POST / dashboard, обрабатывающего POST.
var User = require('../models/account');
/* POST dashboard Page */
router.post('/dashboard', isAuthenticated, function (req, res) {
sess = req.session.passport.user;
console.log('session value is: ' sess);
var newUser = new User();
console.log('newUser id is: ' newUser._id);
var currentUser = req.user._id;
console.log('current User id is: ' currentUser);
var myUser = req.user;
console.log('myUsers value is: ' myUser);
var myUserCourse = req.user.courseEnrolled;
if (sess == currentUser) {
//var newCourse = new course();
console.log('request received: ' req.body.courseEnrolled);
req.user.courseEnrolled = req.body.courseEnrolled;
newUser.save(function (err, data) {
if(error)
throw error;
else {
console.log('course Updated');
}
});
res.render('home', {user: req.user});
}
});
Эта функция newUser.save() создает новый документ в mongodb и сохраняет пройденный курс. Я хочу сохранить значение req.body.courseEnrolled в том же поле документа, где определено другое пользовательское значение.
Это сохраняется в коллекции: — «учетные записи» для пользователя
{
"_id" : ObjectId("57f95afd9c78b91c69334f0d"),
"lastName" : "Nehra",
"firstName" : "Ashish",
"email" : "ashish.nehra@stanford.edu",
"password" : "$2a$10$YzLvbQTHFtq5l0ooP0njOux94Rp.pm.Pkb/TugBnCSTUJNhBBonLG",
"username" : "ashish",
"courseEnrolled" : [
"about to change something now"
],
"__v" : 1
}
И в той же коллекции создается новый документ, подобный этому.
{
"_id" : ObjectId("5803fc4342ca1d3167102300"),
"courseEnrolled" : [ ],
"__v" : 0
}
Ответ №1:
Это логично, потому что сначала вы выполняете это для различных пользовательских объектов (req.user / new user):
**var newUser = new User();
Это создаст новый пользовательский объект, а затем:
newUser.save(function (err, data) {
Это сохранит вновь созданного пользователя в новом документе. Если вы хотите использовать файл .save, перепишите его (повторно используйте свой собственный код):
User.findOne({ 'username' : username }, function(err, user) {
// In case of any error, return using the done method
if (err){
console.log('Error in SignUp: ' err);
return done(err);
}
user.courseEnrolled = req.body.courseEnrolled;
user.save(function (err, data) {
if(err)
throw err;
else {
console.log('course Updated');
}
});
Комментарии:
1. Я попробовал то, что вы предложили, и получил ошибку ссылки.
2. events.js:141 выдает ошибку; // Необработанное событие «ошибка» ^ ReferenceError: ошибка не определена в /home/mobileedx/WebstormProjects/passportAuthentication/routes/index.js:228:19 в /home/mobileedx/WebstormProjects/passportAuthentication/node_modules/mongoose/lib/model.js:3340:16 в /home/mobileedx/WebstormProjects/passportAuthentication/node_modules/mongoose/lib/document.js:1949:15 в nextTickCallbackWith0Args (node.js:420:9) в процессе. _tickCallback (node.js:349:13) Процесс завершен с кодом выхода 1
3. выбросить er; // Необработанное событие «ошибка» ^ Ошибка ссылки: ошибка не определена
4. Да, я видел, что это было из-за проблемы с копированием / вставкой.
5. Спасибо, это сработало. Однако я хочу добавить courseEnrolled в массив. Если вы посмотрите на схему, то увидите, что это массив. Здесь, если я добавлю новый курс, он заменит предыдущий. Я хочу убедиться, что новый курс добавлен в массив вместе с предыдущими курсами.