我正在学习如何使用node.js制作网络应用程序。我一直在关注Alex Young提供的教程。我无法理解pre()函数在Mongoose中的工作原理。我已经阅读了Mongoose API文档,并了解它是一种将现有函数“链接”的方式,但是当我查看代码示例时,我不明白它是如何工作的(参见下面的代码片段)。
我的问题是这里发生了什么?这里涉及三个函数(userSaved(),userSaveFailed()和pre()函数中定义的密码验证函数)。这些功能在运行顺序方面如何相互关联?是否在运行userSaved()和userSavedFail()之前将文档实际保存到数据库中?
我承认我缺乏理解的理解可能是由于我对javascript缺乏了解(我来自PHP背景),但我无法理解这段代码中发生的事情。
在models.js中修改了保存行为:
User.pre('save', function(next) {
if (!validatePresenceOf(this.password)) {
// Through error if password fails validation.
next(new Error('Invalid password'));
}
else {
next();
}
});
调用从app.js保存数据到数据库:
app.post('/users.:format?', function(req, res) {
var user = new User(req.body.user);
function userSaved() {
switch (req.params.format) {
case 'json':
res.send(user.__doc);
break;
default:
req.session.user_id = user.id;
res.redirect('/documents');
}
}
function userSaveFailed() {
res.render('users/new.jade', {
locals: { user: user }
});
}
user.save(userSaved, userSaveFailed);
});
答案 0 :(得分:1)
在我看来,“save”之后的函数是在调用save函数之前执行的方法(正如函数名“PRE”所暗示的那样)。
答案 1 :(得分:0)
运行的第一个函数是user.save()传入两个回调函数,一个用于if;如果user.save()完成且没有错误(userSaved),另一个函数如果失败(userSavedFailed)
User.pre('save', function(next) {
if (!validatePresenceOf(this.password)) {
// Through error if password fails validation.
next(new Error('Invalid password'));
}
else {
next();
}
});
此代码并行运行一组异步函数,仅在所有函数完成后返回响应。在这种情况下,它通过调用回调函数(userSaved或UserSavedFailed)返回。调用哪个取决于在任何函数的处理过程中是否存在错误。
Async Module也链接功能并允许它们同步或并行运行,并可提供一些示例,说明如何完成此操作以帮助您更好地了解实际发生的情况。