Возникают проблемы с пониманием того, как функция pre () в Mongoose работает в этом фрагменте кода - PullRequest
3 голосов
/ 12 ноября 2011

Я учусь создавать веб-приложения с помощью node.js. Я следую учебному пособию, предоставленному Alex Young . У меня возникают проблемы с пониманием того, как функция pre () работает в Mongoose. Я прочитал документацию по API Mongoose и понимаю, что это способ «связать» функции с существующей, но я не понимаю, как это работает на самом деле, когда я смотрю на пример кода (см. Фрагменты кода ниже).

Мой вопрос: что здесь происходит? Здесь задействованы три функции (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 ]

1 голос
/ 23 ноября 2016

По моему мнению, функция, за которой следует «save», - это метод, который выполняется перед вызовом функции сохранения (как следует из названия функции «PRE»).

0 голосов
/ 19 ноября 2011

Первая функция, которая запускается, - это user.save (), передающий два обратных вызова: одна, если 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). То, что вызывается, зависит от того, была ли ошибка в процессе выполнения какой-либо из функций.

Асинхронный модуль также объединяет функции в цепочку и позволяет им работать синхронно или параллельно, а также может предоставить некоторые примеры того, как это делается, чтобы помочь вам лучше понять, что на самом деле происходит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...