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

时间:2013-08-16 05:36:25

标签: node.js mongodb mongoose

嘿所以我试图让用户编辑他们的个人资料。但是,除非添加字段,否则文档中并不总是存在某些字段。以下是我当前正在调用查询的方法,但如果该字段不存在,则会出现错误。

以下是路线文件的代码:

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的NodeJS作为mongodb。我有mongoose模式中的每个字段,但它们不会保存在数据库中,除非它们是由用户手动添加的。

我尝试了但似乎是一个很大的痛苦,循环遍历所有字段值并查看哪些存在,将它们抛出一个数组然后查询数组

这是我尝试过的一种解决方案,因为我需要一些东西来让':'通过...

 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);
        };

我可以做的另一个解决方案是查询用户文档,然后查看可用的值,但我真的很困惑如何去做...

另外,我觉得应该有一种更简单的方法可以做到这一点吗?

修改

这是我的架构:

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);

1 个答案:

答案 0 :(得分:1)

您可以先用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) {
    ...
});

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