Mongoose: рдирдИ рд╕реБрд╡рд┐рдзрд╛: рдЖрднрд╛рд╕реА async

рдХреЛ рдирд┐рд░реНрдорд┐рдд 27 рдЕрдХреНрддреВре░ 2017  ┬╖  42рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: Automattic/mongoose

рдирдИ рд╕реБрд╡рд┐рдзрд╛ virtual async , рдХреГрдкрдпрд╛ рд╕рдорд░реНрдерди рдХрд░реЗрдВ!

const User = new Schema(
  {
    username: {
      type: String,
      index: true,
      unique: true
    },
    encryptedPassword: {
      type: String,
      required: true,
      minlength: 64,
      maxlength: 64
    },
    passwordSalt: {
      type: String,
      required: true,
      minlength: 32,
      maxlength: 32
    }
})

User.virtual('password').set(async function generate(v) {
  this.passwordSalt = await encryptor.salt()
  this.encryptedPassword = await encryptor.hash(v, this.passwordSalt)
})
  const admin = new User({
    username: 'admin',
    password: 'admin'
  })
  admin.save()

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдЖрдкрдХреЗ рдХреЛрдб рдореЗрдВ рдХреБрдЫ рдмрд╣реБрдд рдЕрдЪреНрдЫреЗ рд╡рд┐рдЪрд╛рд░, рд╣рдордиреЗ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдХрдИ рдмрд╛рд░ рджреЗрдЦрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЗрд╕рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╕рдордп рдирд╣реАрдВ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдкрд╕рдВрдж рд╣реИ, рдореИрдВ рдЖрдЧрд╛рдореА рд░рд┐рд▓реАрдЬ рдХреЗ рд▓рд┐рдП рд╡рд┐рдЪрд╛рд░ рдХрд░реВрдВрдЧрд╛

рд╕рднреА 42 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рд╡рд░реНрддрдорд╛рди, рдореИрдВ рдПрдХ рдЧрдВрджреЗ рддрд░реАрдХреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ:

User.virtual('password').set(function(v) {
  this.encryptedPassword = v
})

User.pre('validate', function preValidate(next) {
  return this.encryptPassword().then(next)
})

User.method('encryptPassword', async function encryptPassword() {
  this.passwordSalt = await encryptor.salt()
  this.encryptedPassword = await encryptor.hash(
    this.encryptedPassword,
    this.passwordSalt
  )
})

+1

+1

рдЖрдкрдХреЗ рдХреЛрдб рдореЗрдВ рдХреБрдЫ рдмрд╣реБрдд рдЕрдЪреНрдЫреЗ рд╡рд┐рдЪрд╛рд░, рд╣рдордиреЗ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдХрдИ рдмрд╛рд░ рджреЗрдЦрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЗрд╕рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╕рдордп рдирд╣реАрдВ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдкрд╕рдВрдж рд╣реИ, рдореИрдВ рдЖрдЧрд╛рдореА рд░рд┐рд▓реАрдЬ рдХреЗ рд▓рд┐рдП рд╡рд┐рдЪрд╛рд░ рдХрд░реВрдВрдЧрд╛

рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐.. рдЙрдкрдпреЛрдЧ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ?

await (user.password = 'some-secure-password');

рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

ECMA262 12.15.4 рдХреЗ рдЕрдиреБрд╕рд╛рд░, user.password = 'some-secure-password' рдХрд╛ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп _rval_ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреЛ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ 'some-secure-password' ред

рдЖрдк someVar = object рдХрд╛ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рдПрдХ Promise рд╣реЛрдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдФрд░ рдЗрд╕ рдзрд╛рдЧреЗ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдФрд░ рдЙрдкрд░реЛрдХреНрдд рд▓рд┐рдВрдХ рдХрд┐рдП рдЧрдП ES262 рд╡рд┐рдирд┐рд░реНрджреЗрд╢, рдпрд╣ "ES рд╢рдмреНрджрд╛рд░реНрде рдХрд╛ рдЧрд╣рд░рд╛ рдЙрд▓реНрд▓рдВрдШрди рд╣реИред"

рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдЕрд░реНрде-рдЙрд▓реНрд▓рдВрдШрди рдореБрджреНрджреЗ рдХреЛ рдХреЗрд╡рд▓ рдПрдХ рд╕реБрд╡рд┐рдзрд╛ рд╕рдорд╛рд░реЛрд╣ рд░рдЦрдиреЗ рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рдПрдХ рдмрд╣реБрдд рдмреБрд░рд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ, рдЦрд╛рд╕рдХрд░ рдЬрдм рд╕реЗ рдпрд╣ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдиреЗрд╡рд▓рд╛ рдХреЛрдбрдмреЗрд╕ рдХреЗ рд▓рд┐рдП рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреА рдмреБрд░реА рдЪреАрдЬреЛрдВ рдХрд╛ рдорддрд▓рдм рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдЖрдк рдмрд╕ рдРрд╕рд╛ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░рддреЗ:

const hashPassword = require('./lib/hashPassword');

const password = await hashPassword('some-secure-password');
User.password = password; // This is completely normal.

рд╕рдЪрдореБрдЪ рдПрдХ async рд╕реЗрдЯрд░ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЬреЛ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╡рди-рд▓рд╛рдЗрдирд░ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реА рдЬрдЧрд╣ рдореЗрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЖрдк рдмрд╕ рдпрд╣ рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

User.methods.setPassword = async function (password) {
  const hashedPassword = await hashPassword(password);
  this.password = hashedPassword;
  await this.save();
  return this;
};
const myUser = new User();
await myUser.setPassword('mypassword...');

рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЖрдк рд╡рд░реНрдЪреБрдЕрд▓, рдкреНрд░реА-рд╕реЗрд╡ рд╣реБрдХ рдЖрджрд┐ рдХрд░рдиреЗ рдХреА рд╕рд╛рд░реА рдкрд░реЗрд╢рд╛рдиреА рдХреНрдпреЛрдВ рдЭреЗрд▓реЗрдВрдЧреЗ ...

рдореИрдВ @heisian рд╕реЗ рд╕рд╣рдордд рд╣реВрдВред рдпрд╣ рдореБрдЭреЗ рдЖрдИрдПрдордПрдЪрдУ рдХреЗ рд▓рд┐рдП рдлреАрдЪрд░/рдПрдкреАрдЖрдИ рдмреНрд▓реЛрдЯ рдЬреИрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИред рдореИрдВ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХрд┐ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рдпрд╣рд╛рдВ рдХреИрд╕реЗ рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╣реБрдд рдмрдбрд╝рд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рдирд╛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдмреНрд▓реЛрдЯ рдЬреИрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИред

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЗрд╕ рддрд░рд╣ рдХреА рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП:

User.virtual('password').set((value, done) => {
  encryptValueWithAsyncFunction
    .then(response => done(null, value))
    .catch(reason => done(reason))
  ;
})

@gcanu рдЖрдк рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдирджреЗрдЦрд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рдореИрдВрдиреЗ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рд╣реИ, рдЬреЛ рдЖрдк рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рд╡рд╣ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЙрд▓ рд╕реЗ рдПрдХ рд╡рд╛рджрд╛ рджреЗрддрд╛ рд╣реИ рдФрд░ рдпрд╣ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ/рдИрд╕реАрдПрдордП 262 рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рддреЛрдбрд╝ рджреЗрддрд╛ рд╣реИред рдЖрдкрдХреЗ рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рдХреЛ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЗ рд╕реЗрдЯрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдПрдХ рд╡рд╛рджрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреЛ рдХрд┐ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдкреНрд░рддрд┐ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИ, рдФрд░ рд╡реИрд╕реЗ рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред

рдмрд╕ рдХрд░рдиреЗ рдореЗрдВ рдХреНрдпрд╛ рдЧрд▓рдд рд╣реИ:

await User.setPassword('password');

???

рдпрджрд┐ рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рдирд╣реАрдВ рджреЗрдЦрд╛ рд╣реИ, рддреЛ рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ :

await (User.password = 'password');

@ vkarpov15 рдпрд╣ рдПрдХ рдиреЗрд╡рд▓рд╛-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдореБрджреНрджрд╛ рдирд╣реАрдВ рд╣реИ рдмрд▓реНрдХрд┐ рд╡рд░реНрддрдорд╛рди рдИрд╕реАрдПрдордПрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реНрдкреЗрдХ рдХреА рд╡реИрдзрддрд╛ рдкрд░ рд╕рд╡рд╛рд▓ рдЙрдард╛ рд░рд╣рд╛ рд╣реИред рдпрд╣ "рд╕реБрд╡рд┐рдзрд╛ рдЕрдиреБрд░реЛрдз" рдмрдВрдж рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП...

рдХреЛрдб рдХреЗ рдиреАрдЪреЗ рдмрд╣реБрдд рдмреБрд░рд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ! рдХреНрдпреЛрдВ рд╕реЗрдЯ рдкрд╛рд╕рд╡рд░реНрдб рдореЗрдВ save рдСрдкрд░реЗрд╢рди рд╢рд╛рдорд┐рд▓ рд╣реИ?

User.methods.setPassword = async function (password) {
  const hashedPassword = await hashPassword(password);
  this.password = hashedPassword;
  await this.save();
  return this;
};

const myUser = new User();
await myUser.setPassword('mypassword...');

рдиреЗрд╡рд▓реЗ рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рдЖрдзреБрдирд┐рдХ, рдЕрдзрд┐рдХ рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

@heisian рдареАрдХ рд╣реИ рдореЗрд░реА рдЧрд▓рддреА, рдореИрдВрдиреЗ рд╕реЗрдЯрд░ рдХреЗ рдЙрдкрдпреЛрдЧ рдХрд╛ рдЦреНрдпрд╛рд▓ рдирд╣реАрдВ рд░рдЦрд╛ ...

@heisian рдХреГрдкрдпрд╛ https://github.com/Automattic/mongoose/blob/master/lib/virtualtype.js рджреЗрдЦреЗрдВред

рд╡рд░реНрддрдорд╛рди рдореЗрдВ, Mongoose IMPL рдореЗрдВ, getter рдпрд╛ setter рдмрд╕ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдкрдВрдЬреАрдХреГрдд рдХрд░реЗрдВ рдФрд░ рдХреЙрд▓ рдХрд░реЗрдВ, рдпрд╣ https://tc39.github.io/ecma262/#sec -assignment-operators-runtime-semantics рдирд╣реАрдВ рд╣реИ -рдореВрд▓реНрдпрд╛рдВрдХрди рдФрд░ https://github.com/tc39/ecmascript-asyncawait/issues/82ред рдпрд╣ рдЕрд▓рдЧ рд╣реИред

рддреЛ рдХреГрдкрдпрд╛ рдЗрд╕ рдЕрдиреБрд░реЛрдз рдХреЛ рдЦреЛрд▓реЗрдВред

@ рдлрдВрдбрди , рдореБрдЭреЗ рдпрд╣ рдмрддрд╛рдПрдВ: рдЖрдк рдЕрдкрдиреЗ рд╡рд░реНрдЪреБрдЕрд▓ рд╕реЗрдЯрд░ рдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреИрд╕реЗ рдХрд╣реЗрдВрдЧреЗ? рдХреГрдкрдпрд╛ рдЙрдкрдпреЛрдЧ рджрд┐рдЦрд╛рдПрдВред рдпрджрд┐ рдЖрдк async рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рддреЛ рдЗрд╕реЗ рдПрдХ рд╡рд╛рджреЗ рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЖрдкрдХрд╛ рдореВрд▓ рдЙрджрд╛рд╣рд░рдг рд╕реЗрдЯрд░/рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЙрд▓ рдореЗрдВ рдХрд╣реАрдВ рднреА await рдирд╣реАрдВ рджрд┐рдЦрд╛рддрд╛ рд╣реИред

рдореЗрд░рд╛ рдЙрджрд╛рд╣рд░рдг рдХреЛрдб рд╕рд┐рд░реНрдл рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ ... рдЖрдк рдЗрд╕реЗ рдЗрддрдиреА рдЖрд╕рд╛рдиреА рд╕реЗ рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

User.methods.setPassword = async function (password) {
  const hashedPassword = await hashPassword(password);
  this.password = hashedPassword;
  return this;
};

const myUser = new User();
await myUser.setPassword('mypassword...');
await myUser.save();

рдЬрд╛рд╣рд┐рд░ рд╣реИ..

рдЖрдкрдХрд╛ рдЙрджрд╛рд╣рд░рдг рдореЗрд░реЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред

рдореБрдЭреЗ рдЪрд╛рд╣рд┐рдП

await new User({ password }).save()

рдкрд╛рд╕рд╡рд░реНрдб рдХреЛ рдЙрд╕ рдореЛрдб рдореЗрдВ рд╣реИрд╢ рдХрд░реЗрдВ рдЬреЛ рдЕрдзрд┐рдХ рд╕рд░рд▓, рдЕрдзрд┐рдХ рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рд╣реЛред

рдХреНрдпреЛрдВ? рддреЛ рдЖрдк рдХреЛрдб рдХреА рдХреБрдЫ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рд╕рд╣реЗрдЬ рд╕рдХрддреЗ рд╣реИрдВ? рдХрд╛рд░рдг рд╕рднреА рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рдо рдХреЛ рд╕рд╣реА рдард╣рд░рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИ рдФрд░ рд╕рдВрднрд╡рддрдГ рдХреЛрдбрдмреЗрд╕ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рддреЛрдбрд╝рдирд╛ рд╣реИред

рдЖрдкрдХреЛ рджрд┐рди рдХреЗ рдЕрдВрдд рдореЗрдВ рдпрд╣ рднреА рдорд╣рд╕реВрд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЖрдк рдЗрд╕реЗ рдХреИрд╕реЗ рднреА рд╡рд╛рдХреНрдпрд╛рдВрд╢ рджреЗрддреЗ рд╣реИрдВ, рдореЛрдВрдЧреЛрд╕ рдХреЗ рднреАрддрд░ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рдХреНрдпрд╛ рдЪрд▓ рд░рд╣рд╛ рд╣реИ, рдПрдХ рд╕реЗрдЯрд░ рд╣реИ, рдЬреЛ рдПрд╕рд┐рдВрдХ/рдкреНрд░рддреАрдХреНрд╖рд╛ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдореИрдВ @heisian рд╕реЗ рд╕рд╣рдордд рдирд╣реАрдВ рд╣реВрдВред рдиреЗрд╡рд▓реЗ рдХреЗ рдкрд╛рд╕ рдмрд╣реБрдд рдкреБрд░рд╛рдиреА рдЪреАрдЬреЗрдВ рд╣реИрдВред рдиреЗрд╡рд▓реЗ рдХреЛ рд░рд┐рдлреНрд▓реЗрдХреНрдЯрд░ рдХреА рдЬрд░реВрд░рдд рд╣реИ!
рдиреЗрд╡рд▓реЗ рдХреЛ рдЖрдзреБрдирд┐рдХ рдЪрд╛рд╣рд┐рдПред

рдЕрдЧрд░ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдореИрдВ рдореЛрдВрдЧреЛрдЬрд╝ рдХреЛ рдлреЛрд░реНрдХ рдХрд░реВрдВрдЧрд╛, рдЗрд╕реЗ рд░рд┐рдлреИрдХреНрдЯрд░ рдХрд░реВрдВрдЧрд╛! рдЕрд▓рд╡рд┐рджрд╛!

рдорд╣рд╛рди! рд╡рд╣ рдУрдкрди рд╕реЛрд░реНрд╕ рдХрд╛ рдмрд┐рдВрджреБ рд╣реИред рдХреГрдкрдпрд╛ рдЖрдЧреЗ рдмрдврд╝реЗрдВ рдФрд░ рдПрдХ рдЯреНрд░рд┐рдо рдбрд╛рдЙрди рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рдХрд╛рдВрдЯрд╛ рдмрдирд╛рдПрдВ, рдпрд╣ рд╣рдо рд╕рднреА рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред

await (User.password = 'password'); рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЛрдИ рдЪрд┐рдВрддрд╛ рдирд╣реАрдВ рд╣реИред рдХреЗрд╡рд▓ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдирдХрд╛рд░рд╛рддреНрдордХ рдкрдХреНрд╖ рдпрд╣ рд╣реИ рдХрд┐ user.password = 'password'; рдХрд╛ рдорддрд▓рдм рд╣реЛрдЧрд╛ рдХрд┐ рдХреБрдЫ рдПрд╕рд┐рдВрдХ рдСрдкрд░реЗрд╢рди рд╣реЛ рд░рд╣рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП user.passwordSalt рд╕реЗрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рдХреИрд╕реЗ рд╣реБрдХ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ рдпрд╣ рднреА рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рд╕рд╡рд╛рд▓ рд╣реИ: рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ pre('validate') рдпрд╛ pre('save') рд╣реБрдХ рд╣реИ, рддреЛ рдХреНрдпрд╛ рдЙрдиреНрд╣реЗрдВ user.password async op рд╣реЛрдиреЗ рддрдХ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?

рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╣рд╛рде рд╕реЗ рдЦрд╛рд░рд┐рдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдЪреНрдЫреБрдХ рдирд╣реАрдВ рд╣реВрдВред .save() , .find() , рдЖрджрд┐ рдХреЗ рдкреАрдЫреЗ async рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рд╕рдореЗрдХрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╛рд░реЗ рдореВрд▓реНрдп рд╣реИрдВ, рдмрд╕ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдмрд╛рдХреА рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдлрд┐рдЯ рдмреИрдарддрд╛ рд╣реИред

рдЖрдЬ, async рдЧреЗрдЯрд░реНрд╕ рдФрд░ рд╕реЗрдЯрд░реНрд╕ рдореЗрд░реЗ рд▓рд┐рдП рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВред рдореБрдЭреЗ рдорд╛рд▓рд┐рдХрд╛рдирд╛ рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдлрд╝реАрд▓реНрдб рдХреЛ рдбрд┐рдХреНрд░рд┐рдкреНрдЯ/рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧреЗрдЯрд░реНрд╕ рдФрд░ рд╕реЗрдЯрд░реНрд╕ рд╕реЗ HTTP рдЕрдиреБрд░реЛрдз рднреЗрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рд╡рд░реНрддрдорд╛рди рдореЗрдВ, рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреЛрдИ рд╡рд┐рдЪрд╛рд░ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдП?

@gcanu рдореИрдВ рд╕рд┐рд░реНрдл рдЙрдиреНрд╣реЗрдВ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░реВрдВрдЧрд╛

рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдмрддрд╛рдП рдЧрдП рдХрд╛рд░рдгреЛрдВ рдФрд░ рдЗрд╕ рддрдереНрдп рдХреЗ рд▓рд┐рдП рдХрд┐ рдЖрдкрдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдХрд┐рд╕реА рднреА async рд╕рдВрдЪрд╛рд▓рди рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рддрд░реАрдХреЗ рд╣реИрдВ, рдореБрдЭреЗ async рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдордЬрдмреВрдд рдХрд░рдиреЗ рдХреЗ рдкреАрдЫреЗ рдХреЛрдИ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдирд╣реАрдВ рджрд┐рдЦрддреА рд╣реИ .. рдлрд┐рд░ рд╕реЗ, await (User.password = 'password') ECMAScript рд╕рдореНрдореЗрд▓рди рдХреЛ рддреЛрдбрд╝рддрд╛ рд╣реИ рдФрд░ рдореИрдВ рдЧрд╛рд░рдВрдЯреА рд╣реИ рдХрд┐ рдпрд╣ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛрдиреЗ рд╡рд╛рд▓рд╛ рд╣реИ рдФрд░ рдЗрдирд╛рдпрдд рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рдирд╣реАрдВ рд╣реИ ...

рдЖрдк рд╕рд╣реА рдХрд╣ рд░рд╣реЗ рд╣реИрдВ, рд╡рд╣ рдкреИрдЯрд░реНрди рдХреБрдЫ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рд▓рд╛рдЧреВ рдХрд░реЗрдВрдЧреЗред рд╕рд╣реЗрдЬрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ async рд╡рд░реНрдЪреБрдЕрд▓ рдХреЗ рд╣рд▓ рд╣реЛрдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИред

рдореИрдВ рдЗрд╕реЗ toJSON({virtuals: true}) рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ред рдХреБрдЫ рд╡рд░реНрдЪреБрдЕрд▓ рдлрд╝реАрд▓реНрдб рдЬреЛ рдореБрдЭреЗ рдбреАрдмреА рдореЗрдВ рдЕрдиреНрдп рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рдЪрд▓рд╛рдХрд░ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреЗ рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рдореИрдВ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдХреНрд░рдордмрджреНрдз рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдЪрд▓рд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

@gabzim рдЬреЛ рдмрд╣реБрдд рдЧрдиреНрджрд╛ рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ JSON.stringify рд╡рд╛рджреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рддреЛ res.json() рдХрднреА рднреА рдПрд╕рд┐рдВрдХреНрд╕ рд╡рд░реНрдЪреБрдЕрд▓ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдЬрдм рддрдХ рдХрд┐ рдЖрдк рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рд╣рд╛рдпрдХ рдирд╣реАрдВ рдЬреЛрдбрд╝рддреЗред

рдЖрд╣ рд╣рд╛рдБ, рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рдзрдиреНрдпрд╡рд╛рдж @ vkarpov15

рдХреНрдпрд╛ get рдХреЙрд▓рдмреИрдХ рдХреЗ рдЕрдВрджрд░ рдХреНрд╡реЗрд░реА рдХрд░рдирд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рдЕрднреНрдпрд╛рд╕ рд╣реЛрдЧрд╛?
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред

рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдореИрдВ рдПрдХ рд╡реЗрдм рдкреЗрдЬ (рдпрд╛ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝) рдХрд╛ рдкреВрд░рд╛ рдкрде рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдЬрд╣рд╛рдВ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдХреЛ рдиреЗрд╕реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреБрдЫ рдРрд╕рд╛ рдЬреАрдердм рдпреВрдЖрд░рдПрд▓ рдкрдеред

const Doc = require('./Doc.js');
//...
subDocSchema.virtual('fullpath').get(async function(){
    const doc = await Doc.findById(this.doc); //doc is a Doc ref of type _id
    return `/${ doc.path }/${ this.path }`
})

рдпрд╣рд╛рдВ рд╣рдореЗрдВ async/рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдХреНрд╡реЗрд░реА рдСрдкрд░реЗрд╢рдВрд╕ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд╣реИрдВред

@JulianSoto рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореИрдВ рдЖрдкрдХреЛ рд╡рд░реНрдЪреБрдЕрд▓ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВред рд╡рд░реНрдЪреБрдЕрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╛рдердорд┐рдХ рдХрд╛рд░рдг toJSON() рдФрд░ toObject() рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╡реЗ рдЖрдкрдХреЗ рд▓рд┐рдП async рд╡рд░реНрдЪреБрдЕрд▓ рдХреЛ рд╣реИрдВрдбрд▓ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред

рдореИрдВрдиреЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рднреА рднрд╛рдЧ рд▓рд┐рдпрд╛ рд╣реИ, рдФрд░ рдореИрдВ рдПрдХ рдЕрдЪреНрдЫреЗ рд╕рдорд╛рдзрд╛рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реЛрдЪрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЦреБрд▓рд╛ рд╣реИ, рдФрд░ рд╕реЗрдЯрд░ рдЕрд░реНрдерд╢рд╛рд╕реНрддреНрд░ рдХреЛ рддреЛрдбрд╝рдиреЗ рд╕реЗ рд╕рд╣рдордд рдирд╣реАрдВ рд╣реВрдВред

рдореИрдВрдиреЗ рдиреЗрд╡рд▓рд╛ рдореЙрдбрд▓ рдкрд░ JSON рдкреИрдЪ рд╕реЗрдЯ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рд▓рд┐рдЦреАред рдпрд╣ рдЧрд╣рд░реЗ рд░рд╛рд╕реНрддреЛрдВ рдХреЗ рд╕рд╛рде рдСрдЯреЛ рдЖрдмрд╛рджреА рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ: https://github.com/claytongulick/mongoose-json-patch

рд╡рд┐рдЪрд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рдХреБрдЫ рдирд┐рдпрдореЛрдВ рдХреЗ рд╕рдВрдпреЛрдЬрди рдореЗрдВ: https://github.com/claytongulick/json-patch-rules рдЖрдк JSON рдкреИрдЪ рдХреЗ рд╕рд╛рде 'рд╕реНрд╡рдЪрд╛рд▓рд┐рдд' рдПрдкреАрдЖрдИ рд░рдЦрдиреЗ рдХреЗ рдмрд╣реБрдд рдХрд░реАрдм рдЖ рд╕рдХрддреЗ рд╣реИрдВред

рдореЗрд░реА рдпреЛрдЬрдирд╛ рдпрд╣ рд░рд╣реА рд╣реИ рдХрд┐ рдЙрди рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд╣рд╛рдВ рд╕рд╛рдзрд╛рд░рдг рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рд╡рд░реНрдЪреБрдЕрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдЬрдм рдкреИрдЪ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╡рд░реНрдЪреБрдЕрд▓ рдХреБрдЫ рднреА рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ - рдпрд╣ рдЖрдкрдХреЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдиреЗрд╡рд▓рд╛ рдореЙрдбрд▓ / рдбреАрдмреА рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ рдЕрд▓рдЧ рд╣реЛрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИ рдЬреЛ 'Payment_methods' рдкрд░ 'рдРрдб' рдСрдкрд░реЗрд╢рди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рднреБрдЧрддрд╛рди рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝рдирд╛ рдХрд┐рд╕реА рд╕рд░рдгреА рдореЗрдВ рд╕реАрдзрд╛ рдЬреЛрдбрд╝ рдирд╣реАрдВ рд╣реИ - рдпрд╣ рднреБрдЧрддрд╛рди рдЯреЛрдХрди рдХреЗ рд╕рд╛рде рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЛ рдХреЙрд▓ рдЖрдЙрдЯ рд╣реИ, рднреБрдЧрддрд╛рди рд╡рд┐рдзрд┐ рдЯреЛрдХрди рд╡рд╛рдкрд╕ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛, рдореЙрдбрд▓ рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдирд╛, рдЖрджрд┐ ...

рд▓реЗрдХрд┐рди рдореИрдВ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЙрдбрд▓, рд╡реИрдЪрд╛рд░рд┐рдХ рдореЙрдбрд▓, рдХреЛ JSON рдкреИрдЪ 'рдРрдб' рд╕реЗрд╢рди рдХреЗ рд╕рд╛рде рдкреИрдЪ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

рдПрд╕рд┐рдВрдХреНрд╕ рд╕реЗрдЯрд░реНрд╕ рдХреЗ рдмрд┐рдирд╛, рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХрдорд╛рддреНрд░ рд╡рд┐рдХрд▓реНрдк рд╣реИ рдХрд┐ рдореЛрдВрдЧреЛрдЬрд╝-рдЬреЗрд╕рди-рдкреИрдЪ рдХреЛ рдПрдХ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдП, рдЬрдм рддрдХ рдХрд┐ рдмреЗрд╣рддрд░ рд╡рд┐рдЪрд╛рд░ рди рд╣реЛрдВ, рдкрде, рдСрдкреНрд╕ рдФрд░ рдиреЗрд╡рд▓рд╛ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдмреАрдЪ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдорд╛рдирдЪрд┐рддреНрд░рдг?

@claytongulick рдЖрдкрдХреЛ async рдСрдкрд░реЗрд╢рди рдкрд░ await рдмрдЬрд╛рдп async рд╕реЗрдЯрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ рдФрд░ рдлрд┐рд░ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝ рдХрд░реЗрдВ?

@ vkarpov15 рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдХреЗрд╡рд▓ toObject() рдФрд░ toJSON() async рдмрдирд╛рдиреЗ рдФрд░ toObjectSync() рдФрд░ toJSONSync() рдлрд╝рдВрдХреНрд╢рди рдкреЗрд╢ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛? Sync рд╡реЗрд░рд┐рдПрдВрдЯ рдХреЛ рдХреЗрд╡рд▓ async рд╡рд░реНрдЪреБрдЕрд▓ рдХреЛ рдЫреЛрдбрд╝ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред (рдореБрдЭреЗ рдпрд╛рдж рд╣реИ рдХрд┐ рдпрд╣ рдкреИрдЯрд░реНрди рдХрд╣реАрдВ рди рдХрд╣реАрдВ рдиреЗрд╡рд▓рд╛ рдореЗрдВ рдкреНрд░рдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдмрд╣реБрдд рдЕрдЬреАрдм рдирд╣реАрдВ рд╣реЛрдЧрд╛ред)

рдореЗрд░рд╛ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╣реИ: рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд╕реНрдХреАрдорд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╡рд░реНрдЪреБрдЕрд▓ рд╣реИ рдЬреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рдореЙрдбрд▓ рдкрд░ find() рдХрд░рддрд╛ рд╣реИ (рдмрд╕ рдПрдХ рдЖрдИрдбреА рдХреЛ рдкреЙрдкреНрдпреБрд▓реЗрдЯ рдХрд░рдиреЗ рд╕реЗ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓)ред рдмреЗрд╢рдХ рдореИрдВ рдЕрдкрдиреЗ рдореБрдЦреНрдп рдореЙрдбрд▓ рдореЗрдВ рд╕реЗрд╡/рдбрд┐рд▓реАрдЯ рд╣реБрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рд╛рдорд╛рди рдХреЛ рдирд┐рд░реВрдкрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд░рдЦрд░рдЦрд╛рд╡ рд▓рд╛рдЧрдд рдХреЗ рд╕рд╛рде рдЖрддрд╛ рд╣реИ (рдФрд░ рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рди рд▓рд╛рдн рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ)ред рддреЛ рдореЗрд░реЗ рд▓рд┐рдП рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд░реНрдЪреБрдЕрд▓ рд╣реЛрдирд╛ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд▓рдЧрддрд╛ рд╣реИред

JSON.stringify() async toJSON() рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ , рдЗрд╕рд▓рд┐рдП рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ toJSONSync() рд╡рд┐рдЪрд╛рд░ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред

рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рдХрд╣рд╛ рдерд╛ рдХрд┐ рдЖрдкрдХрд╛ find() рдмрд╣реБрдд рдЬрдЯрд┐рд▓ рд╣реИ, рд▓реЗрдХрд┐рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдХреЗрд╡рд▓ рдорд╛рдорд▓реЗ рдореЗрдВ рд╡рд░реНрдЪреБрдЕрд▓ рдХреЛ

рд╕рд╛рде рд╣реА, рдХреНрдпрд╛ рдЖрдкрдХреЗ рдПрд╕рд┐рдВрдХ рд╡рд░реНрдЪреБрдЕрд▓ рдореЗрдВ рд╕реЗрдЯрд░ рдпрд╛ рдХреЗрд╡рд▓ рдЧреЗрдЯрд░

рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рд╡рд╛рд▓реЗ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╛рдзрд╛рди:

рдорд╛рдорд▓реЗ рдореЗрдВ рдЬрд╣рд╛рдВ рдХреЗрд╡рд▓ рд╕реЗрдЯрд░ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╣реИ, рдореБрдЭреЗ рдПрдХ рд╕рдорд╛рдзрд╛рди рдорд┐рд▓ рдЧрдпрд╛ рд╣реИред рдпрд╣ рдереЛрдбрд╝рд╛ рдЧрдВрджрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рд╡рд┐рдЪрд╛рд░ рд╡рд░реНрдЪреБрдЕрд▓ рд╕реЗрдЯрд░ рдХреЛ рдПрдХ рдХреЙрд▓рдмреИрдХ рдкреНрд░реЛрдк рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╡рд╛рджрд╛ рд░рд┐рдЬрд╝реЙрд▓реНрд╡рд░ рдпреБрдХреНрдд рдСрдмреНрдЬреЗрдХреНрдЯ рдФрд░ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд░реНрдЪреБрдЕрд▓ рдкреНрд░реЙрдкрд░реНрдЯреА рдХреЛ рдкрд╛рд╕ рдХрд░рдирд╛ рд╣реИред рдЬрдм рд╕реЗрдЯрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдХреЙрд▓рдмреИрдХ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╡рд╕реНрддреБ рдХреЛ рдмрдЪрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдкрд╣рд▓реЗ рдкреНрд░рд╢реНрди рд╕реЗ рдкреНрд░реЗрд░рд┐рдд рдореВрд▓ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:

const User = new Schema(
  {
    username: {
      type: String,
      index: true,
      unique: true
    },
    encryptedPassword: {
      type: String,
      required: true,
      minlength: 64,
      maxlength: 64
    }
})

User.virtual('password').set(function generate(inputWithCb, virtual, doc) {
  let cb = inputWithCb.cb;
  let password = inputWithCb.password;
  encryptor.hash(password)
  .then((hash) => {
    doc.set("encryptedPassword", hash);
    cb && cb();
  });
})
// create the document
const admin = new User({
  username: 'admin'
});
// setup the promise for setting the async virtuals
const pwdProm = new Promise((resolve) => {
  admin.set("password", {cb: resolve, password: "admin"});
})

//run the promise and save only when the virtual setters have finished executing
pwdProm
.then(() => {
  admin.save();
});

рдЗрд╕рдХреЗ рдЕрд╡рд╛рдВрдЫрд┐рдд рдкрд░рд┐рдгрд╛рдо рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдЗрд╕рд▓рд┐рдП рдЕрдкрдиреЗ рдЬреЛрдЦрд┐рдо рдкрд░ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

@silto рдЖрдк рдХреЗрд╡рд▓ рдПрдХ рд╕реНрдХреАрдорд╛ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░рддреЗ рдЬреЛ рдПрдХ рд╡рд╛рджрд╛ рд▓реМрдЯрд╛рддреА рд╣реИ?

@ vkarpov15 рдореИрдВ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдРрд╕рд╛ рдХрд░реВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдЬрд┐рд╕ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдореИрдВрдиреЗ рдРрд╕рд╛ рдХрд┐рдпрд╛ рд╣реИ, рдЙрд╕рдореЗрдВ рдореЗрд░реЗ рдкрд╛рд╕ рд╕реНрдХреАрдорд╛, рд╡рд░реНрдЪреБрдЕрд▓ рдФрд░ рдЧреНрд░рд╛рдлрдХреНрдпреВрдПрд▓ рдПрдВрдбрдкреЙрдЗрдВрдЯ рд╣реИрдВ рдЬреЛ рдПрдХ рдЬреЛрдВрд╕ "рдкреНрд▓рд╛рди" рд╕реЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЙрддреНрдкрдиреНрди рд╣реЛрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдзрд┐ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рд╕рдорд╛рди рд╡рд░реНрдЪреБрдЕрд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд░рдЦрдирд╛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВред

@silto рдХреНрдпрд╛ рдЖрдк рдХреЛрдИ рдХреЛрдб рдирдореВрдиреЗ рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдореБрдЭреЗ рдпрд╣ рджреЗрдЦрдирд╛ рдЕрдЪреНрдЫрд╛ рд▓рдЧреЗрдЧрд╛ рдХрд┐ рдпрд╣ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ

рд╕реЗрдЯрд░ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдк рдЗрд╕реЗ рд╕рд╣реЗрдЬрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдпрд╛ рдХреЗрд╡рд▓ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдбреЗрдЯрд╛ рдХреА рддрд▓рд╛рд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрджрд┐ рдЖрдк рд╕рд╣реЗрдЬрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдПрдХ рд╡рд╛рджрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдк рдЙрди рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╡рд╛рджреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рд╣рд▓ рдХрд░реЗрдВ рдФрд░ рдлрд┐рд░ рд╕рд╣реЗрдЬреЗрдВред

рдпрджрд┐ рдЖрдк рдбреЗрдЯрд╛ рдХреА рддрд▓рд╛рд╢ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рд╕реНрдХреАрдорд╛ рд╡рд┐рдХрд▓реНрдкреЛрдВ рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдореЙрдбрд▓ рдПрдХ рд╡рд╛рджрд╛ рдкреНрд░рдХрд╛рд░ рд╣реЛрдЧрд╛ рдпрд╛ рдЬрдм рдЖрдк рдореЙрдбрд▓ рдмрдирд╛рддреЗ рд╣реИрдВ рддреЛ рд╕реНрдХреАрдорд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВ рдФрд░ рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдХреЛрдИ рд╕реЗрдЯрд░, рдЧреЗрдЯрд░ рдпрд╛ рд╡рд░реНрдЪреБрдЕрд▓ рд╣реИ рдЬреЛ рдПрдХ рд╡рд╛рджрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдЪрд╛рд▓реВ рдХрд░реЗрдВ рдЗрд╕реЗ рдПрдХ рд╡рд╛рджреЗ рдореЗрдВред

рдпрд╛ рдЖрдк рдмрд╕ рдПрдХ рдирд┐рд╖реНрдкрд╛рджрди рдЬреИрд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реИ (execPopulate)ред

рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдореЗрдВ, рдпрджрд┐ рдЖрдк рдЙрд╕ рдбреЗрдЯрд╛ рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рд╕реЗрдЯрд░, рдЧреЗрдЯрд░ рдпрд╛ рд╡рд░реНрдЪреБрдЕрд▓ рд╣реИ рддреЛ рдЖрдк рдЙрд╕ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдпрджрд┐ рдЖрдк рдбреЗрдЯрд╛ рдХреЛ рд╕рд╣реЗрдЬрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рд╡рд╛рджрд╛ рд╣реИ рддрд╛рдХрд┐ рдЖрдк рдбреЗрдЯрд╛ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрд╕реА рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХреЗрдВ рдЗрд╕реЗ рдмрдЪрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗред

рдореИрдВ рд╡рд╛рджреЗ рдХреЗ рд╕рд╛рде рд╡рд░реНрдЪреБрдЕрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ рд▓реЗрдХрд┐рди рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВ рдПрдХреНрд╕рдкреНрд░реЗрд╕-рд╡рд╛рджреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рд▓рдЧрднрдЧ рд╣рд░ рд╕рдордп рдореБрдЭреЗ рд╡рд╛рджреЛрдВ рдХреА рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рд╣реИ рд▓реЗрдХрд┐рди рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдореИрдВ рдбреЙрдХреНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред.then (), рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдХрднреА рднреА рд╡рд╛рджреЛрдВ рдХреЗ рд╕рд╛рде рдмрд╕рдиреЗ рд╡рд╛рд▓реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рдореБрдЭреЗ рд╡рд╣ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ ...

рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣рд▓ рдХрд┐рдП рдЧрдП рд╕рднреА рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рд░реИрдкрд░ рд╣реЛрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдФрд░ рд╡рд╛рджрд╛ рдХрд┐рдП рдЧрдП рд╕реЗрдЯрд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдкреНрд░рддреНрдпреЗрдХ рд╡рд╛рджрд╛ рдХрд┐рдП рдЧрдП рд╡рд░реНрдЪреБрдЕрд▓ рдФрд░ рдЧреЗрдЯрд░ рдкрд░ "рддрдм" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдореИрдВ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореЗрдВ рдЖрдкрдХреА рд╕рд╣рд╛рдпрддрд╛ рдХрд░ рд╕рдХреВрдВред

рд╕рд╛рджрд░ред

рдкреБрдирд╢реНрдЪ: рд╡рд╛рджрд╛ рдХрд┐рдП рдЧрдП рд╡рд░реНрдЪреБрдЕрд▓ рдХреЗ рдЙрдкрдпреЛрдЧ рдХрд╛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг, рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдореИрдВ рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП 2 рд░рд╛рд╕реНрддреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдХреНрдпрд╛ рдореЗрд░реЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдХреЛ рд╣рдЯрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдмрд╛рд╣рд░реА рдбреЗрдЯрд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдЖрдорддреМрд░ рдкрд░ рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреНрдп рдореЙрдбрд▓реЛрдВ рд╕реЗ рдкреВрдЫрддрд╛рдЫ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЗрд╕реЗ рд╣рдЯрд╛рдпрд╛ рдпрд╛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ . рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВ рдкрд╣рд▓реЗ рдХрд╣рддрд╛ рд╣реВрдВ, рдПрдХреНрд╕рдкреНрд░реЗрд╕-рд╡рд╛рджрд╛ рдореЗрд░реЗ рд▓рд┐рдП рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдореИрдВ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рдЬрд╛рдВрдЪрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдХреНрдпрд╛ рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рддреЛ рдореБрдЭреЗ рдкрд╣рд▓реЗ рдЗрди рд╡рд╛рджреЛрдВ рдХреЛ рд╣рд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

@chumager рдХреНрдпрд╛ рдЖрдк рдХреГрдкрдпрд╛ рдХреБрдЫ рдХреЛрдб рдирдореВрдиреЗ рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

рд╣рд╛рдп, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдиреАрдЪреЗ рджреА рдЧрдИ рдореЗрд░реА рдЯрд┐рдкреНрдкрдгреА рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдореИрдВ 2 рд╡рд░реНрдЪреБрдЕрд▓ _рдЕрдкрдбреЗрдЯ рдФрд░ _рдбрд┐рд▓реАрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рдФрд░ рдПрдХ рдкреНрд▓рдЧрдЗрди рдЬреЛ рдЙрди рд╡рд░реНрдЪреБрдЕрд▓ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ рдпрджрд┐ рдпрд╣ рд╕реНрдХреАрдорд╛ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рд╣реИ, рддреЛ рд╕рдЪ рд▓реМрдЯ рд░рд╣рд╛ рд╣реИред

рдореЗрд░реЗ рдкрд╛рд╕ рдХреНрд░реЗрдбрд┐рдЯ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд┐рдореБрд▓реЗрд╢рди рдореЙрдбрд▓ рд╣реИ, рдФрд░ рдПрдордХреЗрдЯреА рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рд╕рд┐рдореБрд▓реЗрд╢рди рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЛрдб рд╣реИред
рд╕рд┐рдореНрдпреБрд▓реЗрд╢рди рд╕реЗ рдЬреБрдбрд╝реА рдХреЛрдИ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╣реЛрдиреЗ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╕рд┐рдореНрдпреБрд▓реЗрд╢рди рдХреЛ рд╣рдЯрд╛рдпрд╛ рдирд╣реАрдВ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЕрдЧрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рдирд┐рд╡реЗрд╢ рдХреЗ рд▓рд┐рдП рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдЙрд╕реЗ рдЕрдкрдбреЗрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд╕рд┐рдореБрд▓реЗрд╢рди рдореЗрдВ рд╡рд░реНрдЪреБрдЕрд▓ _рдЕрдкрдбреЗрдЯ рдХрд╛ рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рд╕рдВрджрд░реНрднрд┐рдд рд╕рд┐рдореНрдпреБрд▓реЗрд╢рди рдХреЗ рд╕рд╛рде рдПрдХ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдвреВрдВрдврдХрд░ рд╣реИ рдФрд░ рд╕реНрдерд┐рддрд┐ "рдПрди рдлрд╛рдЗрдиреИрдВрд╕рд┐рдПрдорд┐рдПрдВрдЯреЛ" рд╣реИ, рдпрджрд┐ рдпрд╣ рдХреНрд╡реЗрд░реА рд╕рддреНрдп рд╣реИ рддреЛ рд╕рд┐рдореБрд▓реЗрд╢рди рдХреЛ рдЕрдкрдбреЗрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ... рдЬрд╛рд╣рд┐рд░ рд╣реИ "рдвреВрдВрдвреЗрдВ" рдПрдХ рд╣реИ рд╡рд╛рджрд╛ рддреЛ рдЖрднрд╛рд╕реА рднреА рд╣реИ...

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдо рддреМрд░ рдкрд░ рдореИрдВ рдЗрд╕ рд╡рд░реНрдЪреБрдЕрд▓ рдХреЛ рдлреНрд░рдВрдЯрдПрдВрдб рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рдбреЗрдЯрд╛ рдПрдХ рдореЙрдбреНрдпреВрд▓ рджреНрд╡рд╛рд░рд╛ рдкрд╛рд░реНрд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ (рд╕рд╣ рдпрд╛ рдПрдХреНрд╕рдкреНрд░реЗрд╕-рд╡рд╛рджрд╛ рдПрдХ рдпрд╛ рдкрд░рд┐рдгрд╛рдо рдХреА рдПрдХ рд╕рд░рдгреА рд╣реИ)ред

рдорд╛рдорд▓реЗ рдореЗрдВ рдореИрдВ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рдореИрдВ рдкрд╛рдКрдВрдЧрд╛ рдХрд┐ рдореЗрд░реЗ рд╡рд░реНрдЪреБрдЕрд▓ рд╡рд╛рджреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкрд░рд┐рдгрд╛рдо рдХреЛ рд╡рд╛рджреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрдбрд╝рд╛ ... рд╢рд╛рдпрдж рдкрд░рд┐рдгрд╛рдо рдореЗрдВ рд╕рд╣ рдЬреЛрдбрд╝рдирд╛ рдЬрд╛рджреВ рдХрд░реЗрдЧрд╛, рдпрд╛ рдПрдХ рдкреНрд▓рдЧрдЗрди рдХреЗ рд╕рд╛рде рдЬреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рдмрд╛рдж рд╕рд╣ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ ... рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкрд░рд┐рдгрд╛рдо рд╕реЗрдЯ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд╛рдо рдХрд░ рдЪреБрдХрд╛ рд╣реИред

рдореИрдВ рдиреЗрд╡рд▓реЗ рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╕рдорд╛рдкрди рдмрд┐рдВрджреБрдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рдореБрдЭреЗ рд╣рд░ рдЬрдЧрд╣ рдЙрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдпрд╛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдкреЛрд╕реНрдЯ рд╣реБрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдЧреЗрдЯрд░реНрд╕ рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рдмрд╛рдд, рд╕реЗрдЯрд░реНрд╕ рдХреЗ рд╕рд╛рде рд╣реБрдХ рдкреВрд░реНрд╡ рд╕рддреНрдпрд╛рдкрди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд╕реЗ рдЕрдиреНрдп рдкреНрд░реЙрдкреНрд╕ рдХреЛ рди рдЫреВрдПрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рд╕рд░реНрдХреБрд▓рд░ рд░реЗрдлрд░реЗрдВрд╕ рдФрд░ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдЬреИрд╕реЗ рдЕрдиреНрдп рдкреНрд░реЙрдкреНрд╕ рд╣реИрдВред

рд╕рд╛рджрд░...

рдкреАрдПрд╕: рдЕрдЧрд░ рдЖрдкрдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрджрд╛рд╣рд░рдг рдХреЛрдбреЛ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ рддреЛ рдХреГрдкрдпрд╛ рдореБрдЭреЗ рдмрддрд╛рдПрдВред

@chumager рдЧрджреНрдп рдХреА рдмрдбрд╝реА рджреАрд╡рд╛рд░! == рдХреЛрдб рдирдореВрдирд╛ред рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдХреЛрдб рдирдореВрдирд╛ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕