如何使用 mongo、passport 和 node js 更新用户的个人资料?
Posted
技术标签:
【中文标题】如何使用 mongo、passport 和 node js 更新用户的个人资料?【英文标题】:How to update user's profile using mongo, passport and 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 你说得对,我进行了一些更改。我会更新。它有效,但我确信有更有效的方法。
【参考方案1】:
Model.update 的回调不返回文档。
在你的情况下,我会使用 findById
和 save
。
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
;
;
【讨论】:
请提供一些细节。以上是关于如何使用 mongo、passport 和 node js 更新用户的个人资料?的主要内容,如果未能解决你的问题,请参考以下文章
如何通过 MongoStore 查找存储在 Mongo 中的会话?
Passport + NodeJs + Express 得到“req.user”未定义
如何使用 Mongoose 在 AngularJS 中创建 PUT 函数