无法理解Mongoose中的pre()函数如何在此代码段中工作

时间:2011-11-12 11:20:32

标签: node.js express mongoose

我正在学习如何使用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);
});

2 个答案:

答案 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也链接功能并允许它们同步或并行运行,并可提供一些示例,说明如何完成此操作以帮助您更好地了解实际发生的情况。