如何让用户更新他们的个人资料?

嘿所以我想让用户编辑他们的configuration文件。 但是,有些字段并不总是存在于文档中,除非添加该字段。 这是我目前如何调用查询,但如果该字段不存在,我会得到一个错误。

这里是路由文件的代码:

User.findByIdAndUpdate(req.signedCookies.userid,{ firstName: req.body.firstName.toLowerCase(), lastName: req.body.lastName.toLowerCase(), email: req.body.email.toLowerCase(), firstNameTrue: req.body.firstName, lastNameTrue: req.body.lastName, emailTrue: req.body.email, emailList: req.body.newEmail, phone: req.body.phone, phoneList: req.body.newphone, socialAccounts: {socialAccount: req.body.socialAccount, socialAddress: req.body.socialAccountNew}, currentCity: req.body.currentCity, birthday: new Date(req.body.birthday) }, function(err, user) { console.log('here1'); if(err) { console.log("post2"); console.log(err); res.render('editUserProfileError', {title: 'Weblio'}); } else { console.log("post3"); res.redirect('userProfile'); } }); }; 

我得到的错误是:

 [TypeError: Cannot read property 'constructor' of undefined] 

我用mongoose为MongoDB使用NodeJS。 我有mongoose模式中的每个字段,但它们不保存在数据库中,除非它们是由用户手动添加的。

我已经尝试过,但似乎是一个很大的痛苦,循环遍历所有的字段值,看看哪些存在,扔在一个数组然后查询数组

这是我尝试过的一种解决scheme,因为我需要某些东西来允许':'通过…

  var values = [ firstNameVal = req.body.firstName.toLowerCase(), lastNameVal = req.body.lastName.toLowerCase(), emailVal = req.body.email.toLowerCase(), firstNameTrueVal = req.body.firstName, lastNameTrueVal = req.body.lastName, emailTrueVal = req.body.email, emailListVal = req.body.newEmail, phoneVal = req.body.phone, phoneListVal = req.body.newphone, currentCityVal = req.body.currentCity, birthdayVal = new Date(req.body.birthday) ]; var keyIcons = [ firstName, lastName, email, firstNameTrue, lastNameTrue, emailTrue, emailList, phone, phoneList, currentCity, birthday ]; var existValues =[]; for(var x = 0; x <keyIcons.length; x++) { for(var i = 0; i < values.length; i++) { if(values[i] === undefined) { (console.log('undefined')) } else { existValues.push({keyIcons[i] : values[i]}); } }; } var socialAccountsVal = {socialAccount: req.body.socialAccount, socialAddress: req.body.socialAccountNew} if(socialAccountsVal.socialAccount === undefined) { } else { existValues.push(socialAccounts); }; 

我可能能够做的另一个解决scheme是查询用户文档,然后看看有什么值可用,但我实际上如何去了解它的困惑…

另外,我觉得谎言应该有一个更简单的方法来做到这一点?

编辑

这是我的模式:

 var mongoose = require('mongoose'), Schema = mongoose.Schema, ObjectId = mongoose.Schema.Types.ObjectId, bcrypt = require('bcrypt-nodejs'), SALT_WORK_FACTOR = 10; var UserSchema = new Schema({ email: { type: String, required: true, lowercase:true, index: { unique: true } }, //might have to take off lowercase emailTrue: { type: String}, emailPrivate: {type: Boolean}, emailList: {type: Array}, password: { type: String, required: true }, firstName: {type: String, lowercase:true, required: true, index: true}, firstNameTrue: { type: String}, lastName: {type: String, lowercase:true, required: true, index: true}, lastNameTrue: { type: String}, phone: {type: Number, required: true}, phonePrivate: {type: Boolean}, phoneList: {type: Array}, birthday: {type: Date, required: true}, birthdayPrivate: {type: Boolean}, socialAccounts: {type: Array}, currentCity: {type: String}, date_created: {type: Date}, email_confirmed: {type: Boolean}, gender: {type: Number}, currentDevice: {type: String}, last_login: {type: Date} }, {collection: "users"}); module.exports = mongoose.model('User', UserSchema); 

你可以先在你的req中用字段构造一个对象,然后把这个对象传给mongoose方法:

 var userFields = {}; if (req.body.firstName) userFields.firstName = req.body.firstName.toLowerCase(); if (req.body.lastName) userFields.lastName = req.body.lastName.toLowerCase(); ...etc... User.findByAndUpdate(req.signedCookies.userid, userFields, function(err, user) { ... }); 

这也允许您在将请求中的字段传递给数据库之前对其进行一些消毒处理。