2015-03-16 2 views
0

При регистрации нового пользователя с помощью Mongoose & MongoDB я хотел бы получить значения из другой коллекции перед сохранением экземпляра пользователя. В настоящее время я использую следующее решение, но это приводит к тому, что пользователь дважды получает спасение ... Еще хуже, если пользователь не передает первую проверку, то в любом случае вызов метода save() вызван ... обычно приводит к неперехваченному исключению.Метод асинхронного набора в mongoose

Мой текущий код работает следующим образом:

UserSchema.path('address.postCode').set(function(newVal, cb) { 
    var that = this; 

    this.model('PostCode').findOne({ postCode: newVal }, function(err, postCode) { 
     if(postCode) { 
      that.longitude = postCode.longitude; 
      that.latitude = postCode.latitude; 
     } else { 
      that.longitude = undefined; 
      that.latitude = undefined; 
     } 
     that.save(); 
    }); 
    return newVal; 
}); 

Кто-нибудь знает лучший способ сделать это?

ответ

0

Функция SchemaType#set ожидает синхронного возврата. У вас есть асинхронный вызов внутри этой функции, и поэтому return будет вызываться до того, как PostCode вернет свои результаты.

Кроме того, вы не должны звонить save() внутри сеттера, так как он будет сохранен в любом случае.

Поскольку вы хотите получать данные из другой модели, вы должны использовать предварительное промежуточное программное обеспечение. Например:

UserSchema.pre('save', true, function (next, done) { 
    var that = this; 

    if(this.isNew || this.isModified('address.postCode')) { 
     this.model('PostCode').findOne({ postCode: that.address.postCode }, function(err, postCode) { 
      if(postCode) { 
       that.longitude = postCode.longitude; 
       that.latitude = postCode.latitude; 
      } else { 
       that.longitude = undefined; 
       that.latitude = undefined; 
      } 
      done(); 
     }); 
    } 

    next(); 
}); 

Второй параметр, передаваемый pre (true) является то, что определяет это асинхронный промежуточное программное обеспечение.

Для получения дополнительной информации в средстве, проверьте mongoose docs.

+0

Есть ли все-таки сделать это на обновлениях, но ТОЛЬКО, когда пользователь меняет postCode? – lohfu

+0

Да, я обновил ответ с этим изменением. – victorkohl

Смежные вопросы