【问题标题】:How to update user's profile using mongo, passport and node js?如何使用 mongo、passport 和 node js 更新用户的个人资料?
【发布时间】:2017-12-14 08:49:42
【问题描述】:

我正在创建一个个人项目。我选择Passport.js进行身份验证,我想使用此Mongoose架构更新用户的个人资料:

var userSchema = mongoose.Schema({
local            : {
    email        : {type: String, required: true, unique: true},
    password     : {type: String, required: true}
},
first_name       : {type: String, required: true},
last_name        : {type: String, required: true},
username         : {type: String, required: true, unique: true},
email            : {type: String, required: true, unique: true}});

这里是我使用的 post 路由:

app.post('/editProfile', isLoggedIn, function(req, res, next){
    User.update({ _id: req.user.id}, req.body, function(err, user){
        if(!user){
            req.flash('error', 'No account found');
            return res.redirect('/edit');
        }
        var emailEdit = req.body.email;
        var usernameEdit = req.body.username;
        var first_nameEdit = req.body.firstname;
        var last_nameEdit = req.body.lastname;
        if(emailEdit.lenght <= 0 || usernameEdit.lenght <= 0 || first_nameEdit.lenght <= 0 || last_nameEdit.lenght <= 0){
            req.flash('error', 'One or more fields are empty');
            res.redirect('/edit');
        }
        else{
            user.email = emailEdit;
            user.local.email = emailEdit;
            user.first_name = first_nameEdit;
            user.last_name = last_nameEdit;
            user.username = usernameEdit;

            res.redirect('/profile/');
        }
    });

当我运行它时,我有一个错误,我不明白为什么

TypeError:无法设置未定义的属性“电子邮件”

因为user.local.email = emailEdit; 当我评论这一行时,只有用户名被更新。

我确定这是我犯的一个愚蠢的错误,但我找不到它。

我还在寻找一种最终更有效的方法来使用护照、节点和 mongo 更新配置文件。如果可能的话,一个动态的,例如,如果尚未使用用户名,我可以实时检查并在这种情况下将该字段设置为红色。

【问题讨论】:

  • 嗯...为什么在验证之前更新?您通常在更新之前进行验证。而且没有lenght这样的属性。
  • @Mikey 你说得对,我进行了一些更改。我会更新。它有效,但我确信有更有效的方法。

标签: node.js mongodb mongoose passport.js


【解决方案1】:

Model.update 的回调不返回文档。

在你的情况下,我会使用 findByIdsave

app.post('/editProfile', isLoggedIn, function(req, res, next){

    User.findById(req.user.id, function (err, user) {

        // todo: don't forget to handle err

        if (!user) {
            req.flash('error', 'No account found');
            return res.redirect('/edit');
        }

        // good idea to trim 
        var email = req.body.email.trim();
        var username = req.body.username.trim();
        var firstname = req.body.firstname.trim();
        var lastname = req.body.lastname.trim();

        // validate 
        if (!email || !username || !firstname || !lastname) { // simplified: '' is a falsey
            req.flash('error', 'One or more fields are empty');
            return res.redirect('/edit'); // modified
        }

        // no need for else since you are returning early ^
        user.email = email;
        user.local.email = email; // why do you have two? oh well
        user.first_name = firstname;
        user.last_name = lastname;
        user.username = username;

        // don't forget to save!
        user.save(function (err) {

            // todo: don't forget to handle err

            res.redirect('/profile/');
        });
    });
});

【讨论】:

    【解决方案2】:
    const updateUser = (req ,res, next)=>{
        const updateData = req.body.update;
        if (!updateData){
            res.status(422).send({"message":"please provide what you want to update"})
        }
        User.findOne({email:req.body.user.email}).then(function(user) {
            if (!user) { return res.sendStatus(401); }
    
            //NOTE  only update fields that were actually passed...
            if (typeof updateData.username !== 'undefined') {
                user.username = updateData.username;
            }
            if (typeof updateData.email !== 'undefined') {
                user.email = updateData.email;
            }
            if (typeof updateData.first_name !== 'undefined') {
                user.email = updateData.email;
            }
            if (typeof updateData.last_name !== 'undefined') {
                user.email = updateData.email;
            }
            if (typeof updateData.bio !== 'undefined') {
                user.bio = updateData.bio;
            }
            if (typeof updateData.image !== 'undefined') {
                user.image = updateData.image;
            }
            if (typeof updateData.password !== 'undefined') {
                user.setPassword(updateData.password);
            }
            return user.save()
                .then(function() {
                    return res.json({ user: user.toAuthJSON() });
                });
        }).catch(()=>{
            res.status(422).send({"message":"couldn't update user"})
        }
        );
    };
    UserSchema.methods.generateJWT = function() {
    var today = new Date();
    var exp = new Date(today);
    exp.setDate(today.getDate() + 60);
    return jwt.sign({
        id: this._id,
        username: this.username,
        exp: parseInt(exp.getTime() / 1000),
    }, config.secret);
    

    };

    UserSchema.methods.toAuthJSON = function() {
    return {
        username: this.username,
        email: this.email,
        token: this.generateJWT(),
        bio: this.bio,
        avatar: this.image
    };
    

    };

    【讨论】:

    • 请提供一些细节。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多