如何使用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议的那样,你可以直接使用更新查询。