2016-12-24 3 views
1

Я немного рассола. Всякий раз, когда я создаю новое резюме как зарегистрированного пользователя, он не добавляет id резюме в качестве массива. I.e, ["20293", "2932392", "32903239"]Ссылка Mongoose перезаписана

Вместо этого он перезаписывает текущий идентификатор резюме в схеме пользователей. Вот код

UserSchema

const UserSchema = new Schema({ 
    _vId: { 
     type: String, 
     default: id.generate() 
    }, 
    firstName: { 
     type: String, 
     required: true 
    }, 
    lastName: { 
     type: String, 
     required: true 
    }, 
    accountType: { 
     type: String, 
     enum: ['Alphaneer', 'Administrator', 'Support', 'PRO'], 
     default: 'Alphaneer' 
    }, 
    email: { 
     type: String, 
     required: true, 
     trim: true 
    }, 
    username: { 
     type: String, 
     required: true, 
     trim: true, 
     unique: true 
    }, 
    bio: { 
     type: String, 
     default: "No bio provided." 
    }, 
    // TODO: Hash the password before inserting as a document :) 
    password: { 
     type: String, 
     required: true 
    }, 
    createdAt: { 
     type: String, 
     default: moment(new Date()).format("MMM DD, YYYY") // "Sun, 3PM 17" 
    }, 
    resume: [ { type: mongoose.Schema.ObjectId, ref: "Resume" } ] 
}); 

Где я отправляю мое резюме

// POST /dashboard/resume/create 
router.post('/resume/create', (req, res, next) => { 
    Resume.create(req.body, (err, resume) => { 
    if (err) { 
     var err = new Error("Error:" + err); 
     err.status = 404; 
     next(err); 
    } else { 
     req.user = jwtDecode.decode(req.session.tokenID, 'secret'); 
     //I am assuming that you have saved your resume and getting the saved object in `resume`, now update the logged in user in req.user 
     var user = req.user.sessionId; 
     var updateData = { 
     resume: resume._id 
     } 
     //save the updated user 
     User.findByIdAndUpdate(user, updateData, function(err, user) { 
     console.log(user); 
     if (err) { 
      res.json(err); 
     } else { 
      res.json(user); 
     } 
     }) 
    } 
    }) 
}); 

gif of submitting new resumes

UPDATE:

error picture

ОБНОВЛЕНО КОД:

// POST /dashboard/resume/create 
router.post('/resume/create', (req, res, next) => { 
    Resume.create(req.body, (err, resume) => { 
    if (err) { 
     var err = new Error("Error:" + err); 
     err.status = 404; 
     next(err); 
    } else { 
     req.user = jwtDecode.decode(req.session.tokenID, 'secret'); 
     //I am assuming that you have saved your resume and getting the saved object in `resume`, now update the logged in user in req.user 
     var user = req.user.sessionId; 
     var updateData = { 
     resume: resume._id 
     } 
     //save the updated user 
     User.findById(user, function(err, user) { 
     console.log(user); 
     if (err) { 
      res.json(err); 
     } else { 
      user.resume.push(resume.id) 
      user.save(function(user) { 
      return res.json(user); 
      }); 
     } 
     }) 
    } 
    }) 
}); 
+0

Кажется, вы хотите скорее надавить новый идентификатор «Resume», а обновить всю модель «Пользователь». В этом случае я считаю, что лучше всего найти «Пользователь», как вы это делаете, а затем произнести «user.resume.push (resume.id)», а затем сохранить модель «Пользователь». – ishmaelMakitla

+0

О, ладно, возможно, я дам этот выстрел. – Ethan

+0

Я старался изо всех сил следовать вашему предложению, и я думаю, что получил его, но в нем возникает ошибка, касающаяся возобновления, не являющегося массивом? Я уверен, что я устанавливаю резюме как массив. – Ethan

ответ

0

Это неправильно:

var user = req.user.sessionId; 
    var updateData = { 
    resume: resume._id 
    } 
    //save the updated user 
    User.findByIdAndUpdate(user, updateData, function(err, user) { 
    console.log(user); 
    if (err) { 
     res.json(err); 
    } else { 
     res.json(user); 
    } 
    }); 

Поле resume является массивом, и вы манипулируете его в поле строки. Метод findOneAndUpdate сделать две вещи:

  1. Найти документ по его идентификатор
  2. Обновите его с новыми данными

второй аргумент новые данные для установки. Итак, вторая стадия переведена на:

User.upate({ _id: user }, { resume: resume._id }); 

Вы видите, что не так? resumeдолжен хранить массив идентификатора резюме, и вы устанавливаете id как значение. Очевидно, это вызовет MongooseError.

Ваш второй выстрел является правильным, но есть ошибка опечатка:

User.findById(user, function(err, user) { 
    console.log(user); 
    if (err) { 
     res.json(err); 
    } else { 
     user.resume.push(resume.id) 
     user.save(function(user) { 
     return res.json(user); 
     }); 
    } 
    }); 

Вы должны добавить _id поле, так как это ObjectID нового созданного документа (резюме). Итак, вам нужно сделать user.resume.push(resume._id).

Update

Согласно с последним комментарием, вы хотите, чтобы заполнить вашу модель пользователя, то есть, через ассоциацию иды извлекут все данные модели.В этом случае рекомендуется, чтобы массив резюме изменить следующим образом:

... 
resumes: [ 
    { 
    resume: { 
     type: Schema.Types.ObjectId, 
     ref: 'Resume' 
    } 
    } 
] 

Для заполнения документа пользователя со всеми данными Резюме вам просто нужно ссылаться на ключ resume в resumes массиве поля.

User.findById(user, function(err, user) { 
    if (err) { 
     return res.json({ success: false, message: err.message }); 
    } 
    user.resume.push(resume.id) 
    user.save(function(err, user) { 
     if (err) { 
     return res.json({ success: false, message: err.message }); 
     } 
     // save was fine, finally return the user document populated 
     User.findById(user).populate('resumes.resume').exec(function(err, u) { 
     return res.json(u); 
     }); 
    }); 
    } 
}); 

populate метод принимает строку с полями, которые мы хотим заполнить с ним модели данных. В вашем случае это единственное поле (resume). После запуска запроса вы получите что-то вроде этого:

{ 
    _id: a939v0240mf0205jf48ut84sdfdjg4, 
    ..., 
    resumes: [ 
    resume: { 
     _id: f940tndfq4ut84jofgh03ut85dg9454g, 
     title: 'Some title' 
    }, 
    ... 
    ] 
} 
+0

Так что я должен использовать findOneAndUpdate вместо этого? – Ethan

+0

Прошу прощения, если я не сразу понял, что я не огромный профессионал в кодировании lol – Ethan

+0

Не волнуйся. Ваш первый код неверен, второй - в порядке, но вам просто нужно заменить 'user.resume.push (resume.id)' на 'user.resume.push (resume._id)'. Попробуйте и прокомментируйте. В MongoDB объекты ObjectID хранятся в поле '_id'. –

-1

Просто следить за мой комментарий относительно того, как я предлагаю вам решить вопрос:

router.post('/resume/create', (req, res, next) => { 
    Resume.create(req.body, (err, resume) => { 
    if (err) { 
     var err = new Error("Error:" + err); 
     err.status = 404; 
     next(err); 
    } else { 
     req.user = jwtDecode.decode(req.session.tokenID, 'secret'); 

    //Here, instead of creating a new key entry for resume, you rather push new resume-id into the resume property of the "found user".  
     //find, update and save the user 
     User.findOne({_id: req.user.sessionId}, function (err, userToUpdate) { 
     userToUpdate.toJSON().resume.push(resume.id); 
     userToUpdate.save(function (err) { 
     if(err) { 
      console.error('ERROR!'); 
     } 
     }); 
    }); 

    } 
    }) 
}); 

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

+0

Ваш метод, к сожалению, даже не показывает идентификатор резюме вообще. – Ethan

+0

Это странно - я думаю, что проблема 'resume_.id' может быть проблемой - я предположил, что это будет имя ID-ключа в моделях mongoose - вместо этого оно должно быть« resume.id ». Обновленный ответ при необходимости. – ishmaelMakitla

+0

Проблема решена, но большое вам спасибо! – Ethan

Смежные вопросы