如何使用SailsJS Waterline update()方法将数据添加到集合行中的两个字段
我正在为我的应用程序创build一个忘记的密码function,而我正在努力的一个关键步骤是当用户开始忘记密码处理时,将数据添加到两个忘记密码相关的字段。
字段是
1) resetPasswordToken
– 一个随机生成的令牌,暂时允许用户设置一个新的密码。
2) resetPasswordExpires
– 为创build一个小时而设置的date,该date创build了可更改密码的时间长度。
我到了需要更新用户行的部分(对于需要更改密码的用户),我不知道该怎么做。 我正在尝试使用SailsJS更新方法来完成此操作。 在使用update()
方法更新模型之前,我可以使用如下的标准符号来实现:
User.update(req.param('id'), req.body) .exec(function (err, users) { if (err) { return res.json(400, err); } res.json(users[0]); });
这很容易,因为我一次更新整行,因此,我有我可以通过的id
。 更新整行是唯一的方法来使用更新,我发现是有据可查的。
但是,现在更难了。 我只需要更新两个字段,而当我执行此服务器端操作时,我不认为我有可用的id
。 文档没有指定如何做这样的事情。 我有他们用来注册的email
地址,这是唯一的,所以应该是可以的。 我需要使用某种types的.where()
我认为?
在这一点上,整个服务器端操作看起来有点像这样:
forgot: function (req, res, next) { async.waterfall([ function(done) { crypto.randomBytes(20, function(err, buf) { var token = buf.toString('hex'); done(err, token); }); }, function(token, done) { User.findOne({ email: req.body.email }, function(err, user) { if (!user) { done(null, false, { message: 'Email doesn't exist' }); } user.resetPasswordToken = token; user.resetPasswordExpires = Date.now() + 3600000; // TODO: this part will have to be figured out // Have no idea how to update correctly! Left it blank User.update( ); // Above is the key problem done(err, token, user); }); }, function(token, user, done) { htmlMessage = '<h4>You are receiving this because you (or someone else) have requested the reset of the password for your account.</h4>' + '<p>Please click on the following link, or paste this into your browser to complete the process:</p>' + "<p><a href='http://" + req.headers.host + '/reset/' + token + "'> Link to password reset </a></p>" + '<p>If you did not request this, please ignore this email and your password will remain unchanged.</p>'; var emailInfo = { to: user.email, from: "customerservice@work.com", subject: "Password Reset", message: htmlMessage, fromName: "Random Organization" }; EmailService.simpleSendEmail(emailInfo, function (err) { done(err, 'done'); }); } ], function(err) { if (err) return next(err); res.redirect('/login'); }); },
你快到了。 在获取User
实例并根据需要更改属性之后,而不是调用User.update()
,只需在实例上调用save()
:
User.findOne({/* criteria */}).exec(function(err, user){ if (err) handleErrors(err); user.property = newValue;//and any other changes you need user.save(function(err, savedRecord){ cb(err, savedRecord); }); });
为避免进行两次数据库调用,可以使用update()
方法:
User.update({ email: userEmail }, { resetPasswordToken: newToken, resetPasswordExpires: newExpires }) .exec( function(err, updatedObjArray) { return callback(err, updatedObjArray); // Note that an array will be returned even // if only a single record has been updated. });
你写的大部分代码都是正确的,你只需要改变所说的那一行
User.update( ); done(err, token, user);
至
user.save(function(err){ done(err, token, user); });
或者像@galactocalypsebuild议的那样,你可以直接使用更新查询。