Mongoose: рдХреЙрд▓рдмреИрдХ рдмрдВрдж рд╣реЛ рд░рд╣рд╛ рд╣реИ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 13 рд╕рд┐рддре░ 2016  ┬╖  53рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: Automattic/mongoose

рдореИрдВ рдХреБрдЫ рд╡рд░реНрд╖реЛрдВ рд╕реЗ mongoose рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдореБрдЭреЗ рдмрд╣реБрдд рдкрд░реЗрд╢рд╛рдиреА рд╣реЛ рд░рд╣реА рд╣реИ рдЬрд╣рд╛рдВ рдХрдиреЗрдХреНрд╢рди рдЧрд╛рдпрдм рд╣реЛ рд░рд╣рд╛ рд╣реИред

рд╕рдВрдкрд░реНрдХ рд╡реНрдпрд╡рд╕реНрдерд╛

// Connecting to MongoDB 3.2.1
var connString = "mongodb://xxxxx:xxxxx<strong i="8">@xxxxx</strong>:xxxx,xxxx:xxxx/xxx?ssl=true";
var connOptions = {
  "mongos": { "ssl": true, "sslValidate": false }
};
mongoose.connect(connString, connOptions, function(err, db) {
  if(err) { console.log("Error connecting to db: "+err); }
});

рд╕рдорд╕реНрдпрд╛

рдиреЗрд╡рд▓рд╛ рдмрд╕ рд╡рд╛рдкрд╕ рдмреБрд▓рд╛рдирд╛ рдмрдВрдж рдХрд░ рджреЗрддрд╛ рд╣реИред рдпрд╣ рдХрд┐рд╕реА рднреА рддреНрд░реБрдЯрд┐ рдХрд╛ рдЙрддреНрд╕рд░реНрдЬрди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдореЗрд░реЗ рд╕рд░реНрд╡рд░ рдФрд░ рдбреАрдмреА рдкрд░ рдореЗрдореЛрд░реА/рд╕реАрдкреАрдпреВ рдареАрдХ рд╣реИ, рдФрд░ рдореИрдВ рдХрд┐рд╕реА рдЕрдиреНрдп рд╕рд░реНрд╡рд░ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред рдкреБрдирд░рд╛рд░рдВрдн рдХрд░рдирд╛ рд╣рдореЗрд╢рд╛ рдЗрд╕реЗ рдареАрдХ рдХрд░рддрд╛ рд╣реИ:

db.Something.count({}, callback);

рд╕рдВрд╕реНрдХрд░рдгреЛрдВ

рдХреЙрд▓рдмреИрдХ рдмрдВрдж рд╣реЛрдиреЗ рдкрд░ mongoose 4.4.11 , mongoose.connection.readyState === UNAUTHORIZED рдкрд░ред

рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ mongoose 4.6.0 рдЕрдкрдЧреНрд░реЗрдб рдХрд┐рдпрд╛ рд▓реЗрдХрд┐рди 4 рдШрдВрдЯреЗ рдХреЗ рднреАрддрд░ рдХреЙрд▓рдмреИрдХ рдлрд┐рд░ рд╕реЗ рдмрдВрдж рд╣реЛ рдЧрдпрд╛, рдЕрдм mongoose.connection.readyState === CONNECTED ред

рдХреЛрдИ рд╡рд┐рдЪрд╛рд░

рдХреЛрдИ рднреА рд╡рд┐рдЪрд╛рд░ рдореИрдВ рдЗрд╕реЗ рд╣реЛрдиреЗ рд╕реЗ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ?

рдореБрдЭреЗ рдХреЛрдИ рдФрд░ рдбрд┐рдмрдЧрд┐рдВрдЧ рдЬрд╛рдирдХрд╛рд░реА рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛ рд░рд╣реА рд╣реИ, рдмрд╕ рдореБрдЭреЗ рдмрддрд╛рдПрдВ рдХрд┐ рдХреМрди рд╕реА рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреА рд╣реИред

underlying library issue

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

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдкреАрдЫреЗ рдзрдХреЗрд▓рдирд╛ рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдореЛрдВрдЧреЛрдбрдм рдбреНрд░рд╛рдЗрд╡рд░ рдХреЛ рд░рд┐рд╣рд╛ рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП рдЦреЗрдж рд╣реИ рдФрд░ рдЖрдкрдХреЗ рдзреИрд░реНрдп рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж: +1:

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

рдХреНрдпрд╛ рдЖрдк рдХрд┐рд╕реА рд╕реНрдЯреИрдВрдбрдЕрд▓реЛрди, рд░реЗрдкреНрд▓рд┐рдХрд╛ рд╕реЗрдЯ рдпрд╛ рд╢рд╛рд░реНрдк рдХрд┐рдП рдЧрдП рдХреНрд▓рд╕реНрдЯрд░ рд╕реЗ рдХрдиреЗрдХреНрдЯ рд╣реЛ рд░рд╣реЗ рд╣реИрдВ? рд╕рд╛рде рд╣реА, рдХреНрдпрд╛ рдЖрдк рдкреБрд╖реНрдЯрд┐ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рдПрд╕рдПрд╕рдПрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ?

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

рдиреЗрд╡рд▓рд╛ 4.5.10 рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдиреЗ рд╕реЗ рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рд╣реЛ рдЧрдИред

  • рдкреНрд░рддрд┐рдХреГрддрд┐ рд╕реЗрдЯ рд╕реЗ рдЬреБрдбрд╝рдирд╛
  • рдПрд╕рдПрд╕рдПрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛

4.6.0 рдХреЗ рд╕рд╛рде рднреА рдЗрд╕реА рддрд░рд╣ рдХреА рд╕рдорд╕реНрдпрд╛, рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ рдПрдХ рдкреНрд░рддрд┐рдХреГрддрд┐ рд╕реЗрдЯ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдпрд╛ рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрд╕рдПрд╕рдПрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред

FWIW, 4.6.0 рд▓рдЧрд╛рддрд╛рд░ рдХрдиреЗрдХреНрд╢рди рдЫреЛрдбрд╝ рд░рд╣рд╛ рдерд╛ред 4.5.10 рдЕрдЪреНрдЫрд╛ рд╣реИред

@djanowski рдХреНрдпрд╛ рдЖрдк рдХреЛрдИ рдФрд░ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдЖрдкрдХрд╛ рдХрдиреЗрдХреНрд╢рди рдХреЛрдб рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ рдореЛрдВрдЧреЛрдбрдм рдХрд╛ рдХреМрди рд╕рд╛ рд╕рдВрд╕реНрдХрд░рдг рд╣реИ?

@ vkarpov15 рдореИрдВ MongoDB 3.2.6 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рдерд╛ред

рдХрдиреЗрдХреНрд╢рди рд╡рд┐рдХрд▓реНрдк:

auth: {
  authMechanism: 'SCRAM-SHA-1',
},
mongos: {
  ssl: true,
  sslValidate: true,
  sslCA: [cert],
},

рд╕рд┐рдВрдЧрд▓ рдореЛрдВрдЧреЛ рдпрд╛ рдорд▓реНрдЯреАрдкрд▓ рдореЛрдВрдЧреЛ?

рдПрдХрд╛рдзрд┐рдХ рдореВрдВрдЧред рдХрдВрдкреЛрдЬрд╝ рдореЛрдВрдЧреЛ рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред

рд╕рдорд╕реНрдпрд╛ рдирд┐рд╡рд╛рд░рдг рдореЗрдВ рд╕рд╣рд╛рдпрддрд╛ рдХреЗ рд▓рд┐рдП рдореИрдВ рдФрд░ рдХреБрдЫ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ? рдпрд╣ рд╣рдореЗрдВ рдирдП рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рдЬрд╛рдиреЗ рд╕реЗ рд░реЛрдХ рд░рд╣рд╛ рд╣реИ...

рдЖрдкрдХреЗ рдХреЛрдб рдХреЛ рджреЗрдЦреЗ рдмрд┐рдирд╛ рдореЗрд░реЗ рд▓рд┐рдП рдХреЛрдИ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд░рд┐рдХрд▓реНрдкрдирд╛ рдХрд░рдирд╛ рдХрдард┐рди рд╣реИред рдпрджрд┐ рдЖрдк mongoose.connect рдХрдиреЗрдХреНрдЯ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рддреЛ рдореИрдВ mongoose.connection.readyState рдХреЗ рдорд╛рди рдХреА рдЬрд╛рдБрдЪ рдХрд░реВрдБрдЧрд╛ рдЬрдм рдпрд╣ рд╕рдорд╕реНрдпрд╛ рд╢реБрд░реВ рд╣реЛрдЧреАред рд╕рд╛рде рд╣реА, рдореИрдВ рдиреЗрд╡рд▓рд╛ рдбрд┐рдмрдЧ рдореЛрдб рдХреЛ рд╕рдХреНрд╖рдо рдХрд░реВрдВрдЧрд╛, mongoose.set('debug', true) , рдЬреЛ рдкреНрд░рддреНрдпреЗрдХ рдиреЗрд╡рд▓рд╛ рдСрдкрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рдХрдВрд╕реЛрд▓ рдкрд░ рдбрд┐рдмрдЧ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рдкреНрд░рд┐рдВрдЯ рдХрд░реЗрдЧрд╛ред рд╡реЗ рд╕рдВрджреЗрд╢ рдкреНрд░рд┐рдВрдЯ рд╣реЛ рд░рд╣реЗ рд╣реИрдВ рдпрд╛ рдирд╣реАрдВ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдбрд┐рдмрдЧ рдореЗрдВ рдорджрдж рдХрд░реЗрдВрдЧреЗред

@vkarpov15 рдпрд╣ рд╡рд╣ рдХреЛрдб рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдореИрдВ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд░рд╣рд╛ рд╣реВрдВ: https://gist.github.com/sommestad/c0c6a7fa4feaadf84ecbb59cc3432c90
рдпрд╣ рдПрдХ рдирд┐рдЬреА рдореЙрдбреНрдпреВрд▓ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕рд╛рд░ред

_(рдХрдиреЗрдХреНрд╢рди рд░реИрдкрд┐рдВрдЧ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдХрдиреЗрдХреНрд╢рди рдХреЛ рдХрднреА-рдХрднреА рдЕрдиреНрдп рдирд┐рдЬреА рдПрдирдкреАрдПрдо рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдиреЗ рдРрддрд┐рд╣рд╛рд╕рд┐рдХ рд░реВрдк рд╕реЗ рдиреЗрд╡рд▓реЗ рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред)_

рдЗрди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рд╣реЛрдиреЗ рдкрд░ рдореЗрд░реЗ рдкрд╛рд╕ рдХрдиреЗрдХреНрд╢рди рд╕реНрдерд┐рддрд┐ рдХрд╛ рд▓реЙрдЧрд┐рдВрдЧ рд╕рдХреНрд╖рдо рдерд╛, рд▓реЗрдХрд┐рди рдХрдиреЗрдХреНрд╢рди рд╕реНрд╡рдпрдВ рдирд╣реАрдВ рдмрджрд▓рд╛ (рдХрдо рд╕реЗ рдХрдо рдЙрддреНрд╕рд░реНрдЬрд┐рдд рдХреЛрдИ рдШрдЯрдирд╛ рдирд╣реАрдВ)ред рдЗрд╕рд▓рд┐рдП, рдРрд╕рд╛ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдерд╛ рдХрд┐ рдХреНрд▓рд╛рдЗрдВрдЯ рдбрд┐рд╕реНрдХрдиреЗрдХреНрдЯ рд╣реЛ рдЧрдпрд╛ рдерд╛ред

рдпрд╣ рдпреВрдЖрд░рдЖрдИ рдореЗрдВ replicaSet рд╕реЗ рдХрдиреЗрдХреНрдЯ рдирд╣реАрдВ рд╣реЛ рд░рд╣рд╛ рд╣реИ (рд▓рдХреНрд╖рд┐рдд рдбреЗрдЯрд╛рдмреЗрд╕ рдПрдХ рд▓рд┐рдЦреЗрдВ рдкрд░рд┐рдирд┐рдпреЛрдЬрди рд╣реИ )ред рдЬреИрд╕рд╛ рдХрд┐ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдПрд╕рдПрд╕рдПрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рд╛рде рд╣реА, рдЯреНрд░реИрдлрд┐рдХ рдХреЛ AWS NAT рдЧреЗрдЯрд╡реЗ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд░реВрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред AWS NAT рдХрд╛ рдирд┐рд╖реНрдХреНрд░рд┐рдп рд╕рдордп 5 рдорд┐рдирдЯ рд╣реИ, рд▓реЗрдХрд┐рди рдпреЗ рд╕рдорд╕реНрдпрд╛рдПрдБ рдЙрдЪреНрдЪ рдЯреНрд░реИрдлрд╝рд┐рдХ рдХреЗ рджреМрд░рд╛рди рднреА рд╣реБрдИрдВред

рдореЗрд░реЗ рд▓рд┐рдП рдХреБрдЫ рд╕рдорд╕реНрдпрд╛, рдХреНрдпрд╛ рдЖрдкрдиреЗ рдЗрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛?

@ рдпреБрд╡рд╛ 7 рдирд╣реАрдВ, рдХреЛрдИ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВред рдХреНрдпрд╛ рдЖрдк рдХрдВрдкреЛрдЬрд╝ рдкрд░рд┐рдирд┐рдпреЛрдЬрди рд╕реЗ рднреА рдЬреБрдбрд╝ рд░рд╣реЗ рд╣реИрдВ? рдХреГрдкрдпрд╛ рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд╛рди рдХрд░реЗрдВ

рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВ рдФрд░ рдХреБрдЫ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ? рдХреЛрдИ рд╕рд┐рджреНрдзрд╛рдВрдд рдЬрд┐рд╕рдХреА рдЬрд╛рдВрдЪ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ?

@ рд╕реЛрдореЗрд╕реНрдЯреЗрдб рдХреБрдЫ рднреА рдареЛрд╕ рдирд╣реАрдВ рд╣реИред рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рд▓рд┐рдЦреЗрдВ рд╕реЗ рдХреЛрдИ рд▓реЙрдЧ рд╣реИ?

рдореИрдВрдиреЗ mongoose 4.7.2 рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд▓реЗрдХрд┐рди 48 рдШрдВрдЯреЛрдВ рдХреЗ рдмрд╛рдж рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдЕрдиреБрднрд╡ рдХрд┐рдпрд╛ред рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░, рдореИрдВ 4.4.11 рдкрд░ рд╣реИрдорд╕реНрдЯреНрд░рдВрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдЬрд┐рд╕рдХреЗ рдЕрдкрдиреЗ рдореБрджреНрджреЗ рд╣реИрдВред

рдореИрдВрдиреЗ рд▓реЙрдЧ рдПрдХрддреНрд░ рдХрд░рдиреЗ рдХреА рдЙрдореНрдореАрдж рдореЗрдВ рд╣рдорд╛рд░реЗ рдбреЗрдореЛ рд╕рд░реНрд╡рд░ рдкрд░ 4.7.2 рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╕рдорд╕реНрдпрд╛ рдХреЗ рджреЛ рд╕рдкреНрддрд╛рд╣ рд╕реЗ рдЪрд▓ рд░рд╣рд╛ рд╣реИред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдбреЗрдЯрд╛/рдХрдиреЗрдХреНрд╢рди/рдЖрджрд┐ рдХреА рдорд╛рддреНрд░рд╛ рд╕рдорд╕реНрдпрд╛ рдХреЛ рднрдбрд╝рдХрд╛рддреА рд╣реЛ?

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

db.Something.find({}, callback); //this callback is never fired

рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рдЬрдм рдпрд╣ рд╣реЛ рд░рд╣рд╛ рд╣реИ, mongoose.connection.readyState === CONNECTED

рдЕрдЬреАрдмред рдореЗрд░рд╛ рдорддрд▓рдм рдореЛрдВрдЧреЛрдбрдм рд▓реЙрдЧ рдерд╛ - рдХреНрдпрд╛ рдЖрдк рдореЛрдВрдЧреЛрдбрдм рд╕рд░реНрд╡рд░ рд▓реЙрдЧ рдХреЛ рдбрдВрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрдм рд╡рд╣ рддреНрд░реБрдЯрд┐ рд╣реБрдИ рдереА?

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

@bendytree рдХреНрдпрд╛ рдЖрдк рдЙрд╕ рдбреЗрдореЛ рд╕рд░реНрд╡рд░ рдкрд░ рдХреБрдЫ рд╡реЙрд▓реНрдпреВрдо рдлреЗрдВрдХ рд╕рдХрддреЗ рд╣реИрдВ, рд╢рд╛рдпрдж HTTP рд▓реЛрдб рдЯреЗрд╕реНрдЯрд┐рдВрдЧ рдЯреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ?

@bendytree рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреНрдпрд╛ рдпрд╣ рдиреЛрдб (4.x, 6.x рдФрд░ 7.x) рдХреА рд╕рднреА рд░рд┐рд▓реАрдЬ рд▓рд╛рдЗрдиреЛрдВ рдкрд░ рд╣реЛрддрд╛ рд╣реИ?

@ vkarpov15 рдХреНрдпрд╛ рд╣рдо рджрд░рд╡рд╛рдЬреЗ рд╕реЗ 4.7.7 рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдореИрдВ рдирд╡реАрдирддрдо MongoDB рдбреНрд░рд╛рдЗрд╡рд░ рдХреЗ рд╕рд╛рде рдкрд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХреВрдВ? 4.7.6 рдПрдХ рдРрд╕реЗ рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рдкрд┐рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬреЛ рдмрд╣рд┐рд╖реНрдХреГрдд рд▓рдЧрддрд╛ рд╣реИред

@vkarpov15 66d559b19a86c70e30a8f083d03eb22566571b7e рдзрдиреНрдпрд╡рд╛рдж! рдореИ рдЙрд╕реЗ рдХрд░рдиреЗ рдХреА рдПрдХ рдХреЛрд╢рд┐рд╢ рддреЛ рдХрд░реВрдВрдЧрд╛ред

рдпрд╣рд╛рдВ рд╡рд╣реА, рдПрдХ рдПрд╕рдПрд╕рдПрд▓ рдкреНрд░рддрд┐рдХреГрддрд┐ рдпрд╣рд╛рдВ, рдХреБрдЫ рдорд┐рдирдЯреЛрдВ/рдШрдВрдЯреЛрдВ рдХреЗ рдмрд╛рдж, рдЕрдиреБрд░реЛрдз рдХреЗрд╡рд▓ рдХреЙрд▓рдмреИрдХ() (рдореИрдВрдиреЗ рдХреБрдЫ рдФрд░ рд╡рд░реНрдмреЛрдЬрд╝ рд▓реЙрдЧрд┐рдВрдЧ рдЬреЛрдбрд╝рд╛ рд╣реИ) рдФрд░ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реИред рдореИрдВрдиреЗ рдХрд▓ рд░рд╛рдд 4.7.7 рдореЗрдВ рдЕрдкрдЧреНрд░реЗрдб рдХрд┐рдпрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЕрднреА рднреА рд╕рдорд╕реНрдпрд╛ рд╣реИред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдореИрдВрдиреЗ 4.7.0 рдХреЛ рдбрд╛рдЙрдирдЧреНрд░реЗрдб рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рдерд╛ (5 рдорд┐рдирдЯ рд╕реЗ рднреА рдХрдо рд╕рдордп рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рд╣реЛрдиреЗ рдкрд░)ред рдореИрдВ 4.5.10 рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдБред

@gierschv рдиреЛрдб 6.9.x?

@djanowski рдирд╣реАрдВ, рдЕрднреА рднреА 4.6/4.7.x рдПрд▓рдЯреАрдПрд╕ рдкрд░ред

@djanowski рдореИрдВрдиреЗ рдЗрд╕реЗ рдХреЗрд╡рд▓ Node 4.4.2 . рдкрд░ рдЖрдЬрд╝рдорд╛рдпрд╛ рд╣реИ

рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рд╕рдВрднрд╛рд╡рд┐рдд рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХреА рд╕реВрдЪреА рд░рдЦрддреЗ рд╣реБрдП:

  • #4638
  • #4690
  • #4901

FYI рдХрд░реЗрдВ, 4.5.10 рдпрд╣рд╛рдВ рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдкрд┐рдЫрд▓реЗ 5 рдШрдВрдЯреЛрдВ рд╕реЗ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред рдореЗрд░реЗ рдкрд╛рд╕ рд╕рднреА рдорд╢реАрдиреЛрдВ рдкрд░ #4690 рдЬреИрд╕рд╛ рдЙрдЪреНрдЪ CPU рдЙрдкрдпреЛрдЧ рднреА рдерд╛ рдЬреЛ рдбрд╛рдЙрдирдЧреНрд░реЗрдб рджреНрд╡рд╛рд░рд╛ рднреА рддрдп рдХрд┐рдпрд╛ рдЧрдпрд╛ рд▓рдЧрддрд╛ рд╣реИред

рдпрд╣рд╛рдВ рдХреЛрдИ рдирдпрд╛ рд╡рд┐рдХрд╛рд╕ рдирд╣реАрдВ? рдмрдЧ рдХреЛ рдЦреЛрдЬрдиреЗ рдореЗрдВ рдорджрдж рдХреЗ рд▓рд┐рдП рд╣рдо рдФрд░ рдХреБрдЫ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

@sommestad рдХреНрдпрд╛ рдЖрдкрдХреЛ рдЕрднреА рднреА рдирд╡реАрдирддрдо рдиреЗрд╡рд▓реЗ рдХреЗ рд╕рд╛рде рдпрд╣ рд╕рдорд╕реНрдпрд╛ рд╣реИ?

рдореИрдВрдиреЗ рдЕрднреА рддрдХ рдЕрдкрдЧреНрд░реЗрдб рдХрд░рдиреЗ рдХреА рд╣рд┐рдореНрдордд рдирд╣реАрдВ рдХреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдиреЗ рдореВрд▓ рд░реВрдк рд╕реЗ рдкрд┐рдЫрд▓реА рдмрд╛рд░ рд╣рдорд╛рд░реЗ рдкреВрд░реЗ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рддреЛрдбрд╝ рджрд┐рдпрд╛ рдерд╛ (рдкрд░рд┐рд╡рд░реНрддрди "рдХреБрдЫ" рд╕рдордп рдХреЗ рдмрд╛рдж рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЪрд▓рдиреЗ рдХреЗ рдмрд┐рдирд╛ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдирд╛ рдХрдард┐рди рд╣реИ)ред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдпрд╣ рдорд╛рдирдиреЗ рдХрд╛ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдпрд╣ рддрдп рд╣реИ, рддреЛ рд╣рдо рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдПрдХ рдЕрд▓рдЧ рд╣рд┐рд╕реНрд╕реЗ рдкрд░ рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдкрд┐рдВрдЧ @varunjayaraman

рдореЗрд░реА рдУрд░ рд╕реЗ, рд╣рдордиреЗ рдиреЛрдб 6.x рдПрд▓рдЯреАрдПрд╕ рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд┐рдпрд╛ рдФрд░ рдХреБрдЫ рд╕рдкреНрддрд╛рд╣ рдкрд╣рд▓реЗ рдкрд┐рдЫрд▓реЗ рдиреЗрд╡рд▓рд╛ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдЕрдкрдЧреНрд░реЗрдб рдХрд┐рдпрд╛, рддрдм рд╕реЗ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред

рд╣рдордиреЗ рд▓рдЧрднрдЧ рджреЛ рдорд╣реАрдиреЗ рдкрд╣рд▓реЗ Node 6.10.2, Mongoose 4.9.9 рдореЗрдВ рдЕрдкрдЧреНрд░реЗрдб рдХрд┐рдпрд╛ рдерд╛ред рдЕрднреА рднреА рд╡рд╣реА рдореБрджреНрджрд╛ рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВред

рд╣рдорд╛рд░реЗ рдХрдиреЗрдХреНрд╢рди рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХрд╛ рдкреНрд░рд╛рд░реВрдк mongodb://username:[email protected]:1234,db2.com:2345/db-name?ssl=true ред

console.log("fetching user...");
userCollection.findOne({_id: userId}, function(err, user){
  console.log("done"); // this never happens
  ...
});

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

рдпрджрд┐ рдХреЛрдИ рдбреЗрдЯрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рд╕рдорд╕реНрдпрд╛ рдирд┐рд╡рд╛рд░рдг рдореЗрдВ рд╕рд╣рд╛рдпрддрд╛ рдХреЗ рд▓рд┐рдП рдПрдХрддреНрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдорджрдж рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд▓рдЧреЗрдЧрд╛ред

рдореИрдВ рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдЗрд╕реЗ рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдХреЛрдб рдХреЗ рд╕рд╛рде рдкреБрди: рдкреЗрд╢ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ (рдлрд╛рд╕реНрдЯ рдореЙрдХ-рдЕрдк/рдХреЛрдб рд╢реИрд▓реА рдХреЗ рд▓рд┐рдП рдЦреЗрдж рд╣реИ)ред

рдХрдиреЗрдХреНрд╢рди рдЯрд╛рдЗрдордЖрдЙрдЯ рдХреЛ рдЕрдиреБрдХрд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдкреВрд▓рд╕рд╛рдЗрдЬ рдХреЛ 1 рддрдХ рдХрдо рдХрд░ рджрд┐рдпрд╛ рдФрд░ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ 2 рдПрдВрдбрдкреЙрдЗрдВрдЯреНрд╕ (рд╕рд╛рдорд╛рдиреНрдп/рдзреАрдореА) рдкрд░ рдЯреНрд░рд┐рдЧрд░ рдХрд┐рдпрд╛, рдЬрд┐рдиреНрд╣реЗрдВ рдЗрд╕ рдХреНрд░рдо рдореЗрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ:

  1. рд╕рд╛рдорд╛рдиреНрдп рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ (рдЬреЛ рддреБрд░рдВрдд рдкрд░рд┐рдгрд╛рдо рджреЗрддрд╛ рд╣реИ)
  2. рдзреАрдорд╛ рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ (рдЬреЛ рдПрдХ рдзреАрдореА рдХреНрд╡реЗрд░реА рд╢реБрд░реВ рдХрд░реЗрдЧрд╛)
  3. рд╕рд╛рдорд╛рдиреНрдп рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ (рдЬреЛ 2 рддрдХ рдЙрдкрдпреЛрдЧ рдореЗрдВ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рд╕реЗ рдЙрдкрд▓рдмреНрдз рдХрдиреЗрдХреНрд╢рди рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдЧрд╛)
  4. рд╕рд╛рдорд╛рдиреНрдп рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ (рдЬреЛ рдПрдХ рдорд┐рдирдЯ рдХреЗ рдмрд╛рдж рдЯреНрд░рд┐рдЧрд░ рд╣реЛрдЧрд╛, рдЬрдм 2 рдФрд░ 3 рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк MongoError/рдХрдиреЗрдХреНрд╢рди рдЯрд╛рдЗрдордЖрдЙрдЯ рд╣реЛ рдЬрд╛рдПрдЧрд╛)

рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреБрди: рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВ:

// Require modules
const mongoose = require('mongoose');
const express = require('express');
const request = require('request');
const parseJson = require('body-parser').json();

// Use native Promises in Mongoose
mongoose.Promise = Promise;

// Create the test schema
const testSchema = new mongoose.Schema({
  name: {
    type: String,
    trim: true,
    default: 'test'
  }
});

// Create the mongoose model
mongoose.model('Test', testSchema, 'test');

// Create some test data
mongoose.model('Test').create([
  {name: 'test1'},
  {name: 'test2'},
  {name: 'test3'},
  {name: 'test4'},
  {name: 'test5'}
]);

// Create the Express based app
const app = express();

// Create the express router
const router = express.Router();

// Create a normal route
router.route('/normal').get(parseJson, function (req, res, next) {
  mongoose.model('Test').find({}).then(
    function (data) {
      res.status(200).json(data);
    }
  ).catch(
    function (err) {
      res.status(400).json(err);
    }
  );
});

// Create up a slow route
router.route('/slow').get(parseJson, function (req, res, next) {
  mongoose.model('Test').find({$where: 'sleep(10000) || true'}).then(
    function (data) {
      res.status(200).json(data);
    }
  ).catch(
    function (err) {
      res.status(400).json(err);
    }
  );
});

// Add middleware to console log every request
var requestNumber = 1;
app.use(function (req, res, next) {
  console.log('Request ' + requestNumber, req.method, req.url);
  requestNumber++;
  next();
});

// Use the router
app.use('/', router);

// Listen for requests
app.listen(4000, function () {
  console.log('Server listening on port 4000');
});

// Catch any uncaught exceptions
process.on('uncaughtException', function (err) {
  console.log('Uncaught exception', err);
});

// Catch any unhandled rejections
process.on('unhandledRejection', function (reason) {
  console.error('Unhandled Rejection', reason);
});

// Database connection options
const connectionOpts = {
  // Use the new connection logic
  useMongoClient: true,

  // Do not auto reconnect (the Node code will auto reconnect)
  autoReconnect: false,

  // Use a poolsize of 1 to simulate a timeout using multiple request to slow and normal endpoints
  poolSize: 1
};

// Connection method with retry
const connectWithRetry = function () {
  // Check if we still need to connect
  if (mongoose.connection.readyState !== mongoose.Connection.STATES.connected) {
    // Connect
    return mongoose.connect('mongodb://localhost:27017/test', connectionOpts).catch(
      function (err) {
        console.log('Can not connect to mongo', err);
      }
    );
  }
};

// Helper function to execute a request to the normal endpoint
const doRequestNormal = function () {
  request({
    url: 'http://localhost:4000/normal',
    json: true,
    timeout: 60000
  }, function (error, response, body) {
    if (error) {
      console.log('Error on normal request', error, response);
    }
    console.log('Performed normal request, body:', body);
  });
};

// Helper function to execute a request to the normal endpoint
const doRequestSlow = function () {
  request({
    url: 'http://localhost:4000/slow',
    json: true,
    timeout: 60000
  }, function (error, response, body) {
    if (error) {
      console.log('Error on slow request', error, response);
    }
    console.log('Performed slow request', body);
  });
};

// Helper function to simulate requests
const doRequests = function () {
  doRequestNormal();
  doRequestSlow();
  doRequestNormal();

  setTimeout(function () {
    console.log('Do normal request after 1 minute');
    doRequestNormal();
  }, 60000);
};

// Connecting event
mongoose.connection.on('connecting', function () {
  console.log('Connecting to database...');
});

// Connected event
mongoose.connection.on('connected', function () {
  console.log('Database is connected, start requesting...');
  doRequests();
});

// Timeout event
mongoose.connection.on('timeout', function (err) {
  console.log('Database timeout error', err);
});

// Error event
mongoose.connection.on('error', function (err) {
  console.log('Database connection error', err);
});

// Disconnected event
mongoose.connection.on('disconnected', function () {
  console.error('Database got disconnected, reconnecting in 5 sec...');

  // Reconnect in 5 seconds
  setTimeout(connectWithRetry, 5000);
});

// Connect to the database with retry
connectWithRetry();

// Log the connection state every 10 seconds
setInterval(function () {
  console.log('Mongoose connection readystate is', mongoose.connection.readyState);
}, 10000);

рдХрдВрд╕реЛрд▓ рдЖрдЙрдЯрдкреБрдЯ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:

Connecting to database...
Server listening on port 4000
Database is connected, start requesting...
Request 1 GET /normal
Request 2 GET /slow
Request 3 GET /normal
Performed normal request, body: [ { _id: '597f8c6f41bf2e119594ba1a', __v: 0, name: 'test1' },
  { _id: '597f8c6f41bf2e119594ba1b', __v: 0, name: 'test2' },
  { _id: '597f8c6f41bf2e119594ba1c', __v: 0, name: 'test3' },
  { _id: '597f8c6f41bf2e119594ba1d', __v: 0, name: 'test4' },
  { _id: '597f8c6f41bf2e119594ba1e', __v: 0, name: 'test5' } ]
Mongoose connection readystate is 1
Mongoose connection readystate is 1
Mongoose connection readystate is 1
Performed slow request { name: 'MongoError',
  message: 'connection 0 to localhost:27017 timed out' }
Performed normal request, body: { name: 'MongoError',
  message: 'connection 0 to localhost:27017 timed out' }
Mongoose connection readystate is 1
Mongoose connection readystate is 1
Mongoose connection readystate is 1
Do normal request after 1 minute
Request 4 GET /normal
Mongoose connection readystate is 1
Mongoose connection readystate is 1
Mongoose connection readystate is 1
Mongoose connection readystate is 1
Mongoose connection readystate is 1
Mongoose connection readystate is 1
Error on normal request { Error: ESOCKETTIMEDOUT
    at ClientRequest.<anonymous> (/Users/adriaanmeuris/Documents/Projecten/Mongoose timeout/node_modules/request/request.js:819:19)
    at ClientRequest.g (events.js:291:16)
    at emitNone (events.js:86:13)
    at ClientRequest.emit (events.js:185:7)
    at Socket.emitTimeout (_http_client.js:620:10)
    at Socket.g (events.js:291:16)
    at emitNone (events.js:86:13)
    at Socket.emit (events.js:185:7)
    at Socket._onTimeout (net.js:339:8)
    at ontimeout (timers.js:365:14)
    at tryOnTimeout (timers.js:237:5)
    at Timer.listOnTimeout (timers.js:207:5) code: 'ESOCKETTIMEDOUT', connect: false } undefined
Performed normal request, body: undefined
Mongoose connection readystate is 1
Mongoose connection readystate is 1

рдореИрдВ рд╣рд░ 10 рд╕реЗрдХрдВрдб рдореЗрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рддреИрдпрд╛рд░ рд╕реНрдерд┐рддрд┐ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рддрд╛ рд╣реВрдВ, рдЬреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХрдиреЗрдХреНрд╢рди рдЕрднреА рднреА рд╕рдХреНрд░рд┐рдп рд╣реИред рдХреЛрдИ рдиреЗрд╡рд▓рд╛ рддреНрд░реБрдЯрд┐ / рдЯрд╛рдЗрдордЖрдЙрдЯ рдШрдЯрдирд╛ рдЯреНрд░рд┐рдЧрд░ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рдФрд░ рдЕрдиреБрд░реЛрдз 4 рдХрд╛ рдХреЙрд▓рдмреИрдХ рдХрднреА рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ (рдпрд╣ рдЕрдиреБрд░реЛрдз рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ 60 рдХреЗ рджрд╢рдХ рдХреЗ рдмрд╛рдж рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ)ред рдЖрдк http://localhost :4000/slow рдФрд░ рдЕрдЧрд▓реЗ http://localhost :4000/normal рдкрд░ рдЬрд╛рдХрд░ рднреА рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдореИрдВ https://team.goodeggs.com/reconnecting-to-mongodb-when-mongoose-connect-fails-at-startup-83ca8496ca02 рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдСрдЯреЛ рд░реАрдХрдиреЗрдХреНрд╢рди рд▓реЙрдЬрд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдХрднреА рднреА рдЯреНрд░рд┐рдЧрд░ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореЛрдВрдЧреЛ рдбрд┐рд╕реНрдХрдиреЗрдХреНрдЯ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред

рдХреБрдЫ рдореМрдХреЛрдВ рдкрд░, рдЬрдм рдореИрдВ рдЙрд╕ рдХреЛрдб рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдХрд░рддрд╛ рд╣реВрдВ рдЬреЛ рдХреБрдЫ рдкрд░реАрдХреНрд╖рдг рдбреЗрдЯрд╛ рдмрдирд╛рддрд╛ рд╣реИ (рдЗрд╕рд▓рд┐рдП рдореВрд▓ рд░реВрдк рд╕реЗ рдПрдХ рдЦрд╛рд▓реА рд╕рдВрдЧреНрд░рд╣ рдХреЛ рдХреНрд╡реЗрд░реА рдХрд░рдирд╛)

рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЗ:

  • #4789
  • #4660

рдХрд┐рд╕реА рднреА рдорджрдж рдХреА рдореБрдЭреЗ рдмрд╣реБрдд рд╕рд░рд╛рд╣рдирд╛ рд╣реЛрдЧреАред

рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдХреБрдЫ рдФрд░ рдЦреБрджрд╛рдИ рдХреА рдФрд░ рдКрдкрд░ рдХреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдиреЗрд╡рд▓рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рдиреЛрдб-рдореЛрдВрдЧреЛрдбрдм-рдиреЗрдЯрд┐рд╡ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛ред рдкрд░рд┐рдгрд╛рдо рдЕрдм рдмрд╣реБрдд рдЕрд▓рдЧ рд╣реИрдВ:

рдХрдиреЗрдХреНрд╢рди рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдФрд░ рдЕрдиреБрд░реЛрдз рд╕рдорд╛рди рд╣реИрдВ:

  1. рд╕рд╛рдорд╛рдиреНрдп рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ (рдЬреЛ рддреБрд░рдВрдд рдкрд░рд┐рдгрд╛рдо рджреЗрддрд╛ рд╣реИ)
  2. рдзреАрдорд╛ рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ (рдЬреЛ рдПрдХ рдзреАрдореА рдХреНрд╡реЗрд░реА рд╢реБрд░реВ рдХрд░реЗрдЧрд╛)
  3. рд╕рд╛рдорд╛рдиреНрдп рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ (рдЬреЛ 2 рддрдХ рдЙрдкрдпреЛрдЧ рдореЗрдВ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рд╕реЗ рдЙрдкрд▓рдмреНрдз рдХрдиреЗрдХреНрд╢рди рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдЧрд╛)
  4. рд╕рд╛рдорд╛рдиреНрдп рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ (рдЬреЛ рдПрдХ рдорд┐рдирдЯ рдХреЗ рдмрд╛рдж рдЪрд╛рд▓реВ рд╣реЛ рдЬрд╛рдПрдЧрд╛)

рдХреЛрдб:

// Require modules
const MongoClient = require('mongodb').MongoClient;
const Server = require('mongodb').Server;
const express = require('express');
const request = require('request');
const parseJson = require('body-parser').json();

// The db reference
var db;

// Function to insert test data
function insertTestData() {
  return new Promise(function (resolve, reject) {
    // Get the test collection
    var test = db.collection('test');

    // Insert some documents
    test.insertMany([
      {name: 'test1'},
      {name: 'test2'},
      {name: 'test3'},
      {name: 'test4'},
      {name: 'test5'}
    ], function (err, result) {
      if (err) {
        reject(err);
      } else {
        resolve();
      }
    });
  });
}

// Create the Express based app
const app = express();

// Create the express router
const router = express.Router();

// Create a normal route
router.route('/normal').get(parseJson, function (req, res, next) {
  // Get the documents collection
  var collection = db.collection('test');

  // Find some documents
  collection.find({}).toArray(function (err, data) {
    if (err) {
      res.status(400).json(err);
    } else {
      res.status(200).json(data);
    }
  });
});

// Create up a slow route
router.route('/slow').get(parseJson, function (req, res, next) {
  // Get the documents collection
  var collection = db.collection('test');

  // Find some documents
  collection.find({$where: 'sleep(10000) || true'}).toArray(function (err, data) {
    if (err) {
      res.status(400).json(err);
    } else {
      res.status(200).json(data);
    }
  });
});

// Add middleware to console log every request
var requestNumber = 1;
app.use(function (req, res, next) {
  console.log('Request ' + requestNumber, req.method, req.url);
  requestNumber++;
  next();
});

// Use the router
app.use('/', router);

// Listen for requests
app.listen(4000, function () {
  console.log('Server listening on port 4000');
});

// Catch any uncaught exceptions
process.on('uncaughtException', function (err) {
  console.log('Uncaught exception', err);
});

// Catch any unhandled rejections
process.on('unhandledRejection', function (reason) {
  console.error('Unhandled Rejection', reason);
});

// Database connection options
const connectionOpts = {
  // Do not auto reconnect (the Node code will auto reconnect)
  autoReconnect: false,

  // Use a poolsize of 1 to simulate a timeout using multiple request to slow and normal endpoints
  poolSize: 1
};

// Connection method with retry
const connectWithRetry = function () {

  return MongoClient.connect('mongodb://localhost:27017/test', connectionOpts).then(
    function (database) {
      db = database;
      setupEvents();
      console.log('Connected to mongo');
    }
  ).catch(
    function (err) {
      console.log('Can not connect to mongo', err);
      return err;
    }
  );
};

// Helper function to execute a request to the normal endpoint
const doRequestNormal = function () {
  request({
    url: 'http://localhost:4000/normal',
    json: true,
    timeout: 60000
  }, function (error, response, body) {
    if (error) {
      console.log('Error on normal request', error, response);
    }
    console.log('Performed normal request, body:', body);
  });
};

// Helper function to execute a request to the normal endpoint
const doRequestSlow = function () {
  request({
    url: 'http://localhost:4000/slow',
    json: true,
    timeout: 60000
  }, function (error, response, body) {
    if (error) {
      console.log('Error on slow request', error, response);
    }
    console.log('Performed slow request', body);
  });
};

// Helper function to simulate requests
const doRequests = function () {
  doRequestNormal();
  doRequestSlow();
  doRequestNormal();

  setTimeout(function () {
    console.log('Do normal request after 1 minute');
    doRequestNormal();
  }, 60000);
};

// Helper function to setup mongo events
function setupEvents() {
// Connecting event
  db.on('connecting', function () {
    console.log('Connecting to database...');
  });

// Connected event
  db.on('connected', function () {
    console.log('Database is connected, start requesting...');
  });

// Timeout event
  db.on('timeout', function (err) {
    console.log('Database timeout error', err);
  });

// Error event
  db.on('error', function (err) {
    console.log('Database connection error', err);
  });

// Disconnected event
  db.on('close', function () {
    console.error('Database got disconnected, reconnecting in 5 sec...');

    // Reconnect in 5 seconds
    setTimeout(connectWithRetry, 5000);
  });
}

// Connect to the database with retry
connectWithRetry().then(
  function () {
    return insertTestData();
  }
).then(
  function () {
    doRequests();
  }
);

рдХрдВрд╕реЛрд▓ рдЖрдЙрдЯрдкреБрдЯ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:

Server listening on port 4000
Connected to mongo
Request 1 GET /normal
Request 2 GET /slow
Request 3 GET /normal
Performed normal request, body: [ { _id: '598207c16caf9224cf3b8897', name: 'test1' },
  { _id: '598207c16caf9224cf3b8898', name: 'test2' },
  { _id: '598207c16caf9224cf3b8899', name: 'test3' },
  { _id: '598207c16caf9224cf3b889a', name: 'test4' },
  { _id: '598207c16caf9224cf3b889b', name: 'test5' } ]
Performed slow request [ { _id: '598207c16caf9224cf3b8897', name: 'test1' },
  { _id: '598207c16caf9224cf3b8898', name: 'test2' },
  { _id: '598207c16caf9224cf3b8899', name: 'test3' },
  { _id: '598207c16caf9224cf3b889a', name: 'test4' },
  { _id: '598207c16caf9224cf3b889b', name: 'test5' } ]
Performed normal request, body: [ { _id: '598207c16caf9224cf3b8897', name: 'test1' },
  { _id: '598207c16caf9224cf3b8898', name: 'test2' },
  { _id: '598207c16caf9224cf3b8899', name: 'test3' },
  { _id: '598207c16caf9224cf3b889a', name: 'test4' },
  { _id: '598207c16caf9224cf3b889b', name: 'test5' } ]
Do normal request after 1 minute
Request 4 GET /normal
Performed normal request, body: [ { _id: '598207c16caf9224cf3b8897', name: 'test1' },
  { _id: '598207c16caf9224cf3b8898', name: 'test2' },
  { _id: '598207c16caf9224cf3b8899', name: 'test3' },
  { _id: '598207c16caf9224cf3b889a', name: 'test4' },
  { _id: '598207c16caf9224cf3b889b', name: 'test5' } ]

рдкрд┐рдЫрд▓реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреА рддрд░рд╣ рдХреЛрдИ рдореЛрдВрдЧреЛ рддреНрд░реБрдЯрд┐/рдЯрд╛рдЗрдордЖрдЙрдЯ рдИрд╡реЗрдВрдЯ рдЯреНрд░рд┐рдЧрд░ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдиреБрд░реЛрдз 2 рдФрд░ 3 рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╣рд▓ рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рдЕрдиреБрд░реЛрдз 4 рдХрд╛ рдХреЙрд▓рдмреИрдХ рднреА рдЯреНрд░рд┐рдЧрд░ рд╣реЛрддрд╛ рд╣реИ - рдЙрд╕ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╡рд┐рдкрд░реАрдд рдЬреЛ рдореЛрдВрдЧреЛрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИред

рдореИрдВ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдПрдХ рдиреЗрд╡рд▓рд╛ рдмрдирд╛рдо рдПрдХ рдореЛрдВрдЧреЛ рдореБрджреНрджрд╛ рд╣реИ - рдЗрд╕рд▓рд┐рдП рдЗрди рд▓рд┐рдкрд┐рдпреЛрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдХрд┐рд╕реА рднреА рдорджрдж рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХреА рдЬрд╛рдПрдЧреАред рд╢рд╛рдпрдж @ vkarpov15 рдЗрд╕ рдкрд░ рдЭрдВрдХрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдзрдиреНрдпрд╡рд╛рдж!

@adriaanmeuris рдпрд╣ рдЕрдЬреАрдм рд╣реИ, рдпрд╣рд╛рдБ рдЖрдЙрдЯрдкреБрдЯ рд╣реИ рдЬреЛ рдореБрдЭреЗ рдЖрдкрдХреА рдкрд╣рд▓реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рд╛рдиреЗ рд╕реЗ рдорд┐рд▓рддрд╛ рд╣реИ:

$ node gh-4513.js 
Connecting to database...
Server listening on port 4000
Database is connected, start requesting...
Request 1 GET /normal
Request 2 GET /slow
Request 3 GET /normal
Performed normal request, body: [ { _id: '5998e4a79bb81d37ac4b1a26', __v: 0, name: 'test1' },
  { _id: '5998e4a79bb81d37ac4b1a27', __v: 0, name: 'test2' },
  { _id: '5998e4a79bb81d37ac4b1a28', __v: 0, name: 'test3' },
  { _id: '5998e4a79bb81d37ac4b1a29', __v: 0, name: 'test4' },
  { _id: '5998e4a79bb81d37ac4b1a2a', __v: 0, name: 'test5' } ]
Mongoose connection readystate is 1
Mongoose connection readystate is 1
Mongoose connection readystate is 1
Mongoose connection readystate is 1
Mongoose connection readystate is 1
Performed slow request [ { _id: '5998e4a79bb81d37ac4b1a26', __v: 0, name: 'test1' },
  { _id: '5998e4a79bb81d37ac4b1a27', __v: 0, name: 'test2' },
  { _id: '5998e4a79bb81d37ac4b1a28', __v: 0, name: 'test3' },
  { _id: '5998e4a79bb81d37ac4b1a29', __v: 0, name: 'test4' },
  { _id: '5998e4a79bb81d37ac4b1a2a', __v: 0, name: 'test5' } ]
Performed normal request, body: [ { _id: '5998e4a79bb81d37ac4b1a26', __v: 0, name: 'test1' },
  { _id: '5998e4a79bb81d37ac4b1a27', __v: 0, name: 'test2' },
  { _id: '5998e4a79bb81d37ac4b1a28', __v: 0, name: 'test3' },
  { _id: '5998e4a79bb81d37ac4b1a29', __v: 0, name: 'test4' },
  { _id: '5998e4a79bb81d37ac4b1a2a', __v: 0, name: 'test5' } ]
Mongoose connection readystate is 1
Do normal request after 1 minute
Request 4 GET /normal
Performed normal request, body: [ { _id: '5998e4a79bb81d37ac4b1a26', __v: 0, name: 'test1' },
  { _id: '5998e4a79bb81d37ac4b1a27', __v: 0, name: 'test2' },
  { _id: '5998e4a79bb81d37ac4b1a28', __v: 0, name: 'test3' },
  { _id: '5998e4a79bb81d37ac4b1a29', __v: 0, name: 'test4' },
  { _id: '5998e4a79bb81d37ac4b1a2a', __v: 0, name: 'test5' } ]
Mongoose connection readystate is 1
Mongoose connection readystate is 1
^C
$ 

рдиреЗрд╡рд▓рд╛ рдЬреБрдбрд╝рд╛ рд░рд╣рддрд╛ рд╣реИред рдХреНрдпрд╛ рдЖрдк рдореЛрдВрдЧреЛрдбрдм, рдиреЛрдб рдФрд░ рдиреЗрд╡рд▓рд╛ рдХреЗ рдЕрдкрдиреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

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

рдореИрдВ рдЗрд╕рдХреЗ рд╕рд╛рде рдкрд░реАрдХреНрд╖рдг рдХрд░ рд░рд╣рд╛ рдерд╛:

  • рдиреЛрдб 6.8.1
  • рдореЛрдВрдЧреЛрдбрдм 2.2.30
  • рдиреЗрд╡рд▓рд╛ 4.11.5

рдореИрдВрдиреЗ рдЗрд╕рдореЗрдВ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рд╣реИ:

  • рдиреЛрдб 6.8.1
  • рдореЛрдВрдЧреЛрдбрдм 2.2.31
  • рдиреЗрд╡рд▓рд╛ 4.11.7

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

mongoose.model('Test').find({$where: 'sleep(10000) || true'})

(рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдкреНрд░рддреНрдпреЗрдХ рдорд╢реАрди рдкрд░ рдЯрд╛рдЗрдордЖрдЙрдЯ рдЯреНрд░рд┐рдЧрд░ рдХрд░реЗрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдкреБрди: рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдХреНрд╡реЗрд░реА рдореЗрдВ рдмрджрд▓рд╛рд╡ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ)

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

рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╣рдордиреЗ рдкрд╣рд▓реЗ @adriaanmeuris рдХреА рддрд░рд╣ рд╣реА рдореБрджреНрджреЛрдВ рдХреЛ

рд░рдирд┐рдВрдЧ рдиреЛрдб 8.

рд╣рдо рдЕрднреА рднреА рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╕рдордп-рд╕рдордп рдкрд░ рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВред

рдореИрдВ рдЗрд╕реЗ @adriaanmeuris рдХреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рд╛рде рдкреБрди: рдкреЗрд╢ рдирд╣реАрдВ рдХрд░ рд╕рдХрд╛, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рдПрдХ рд╕рдВрд╢реЛрдзрд┐рдд рд╕рдВрд╕реНрдХрд░рдг рд╣реИ рдЬреЛ рдЗрд╕реЗ рд╣рд░ рдмрд╛рд░ рдореЗрд░реЗ рд▓рд┐рдП рдкреБрди: рдкреЗрд╢ рдХрд░рддрд╛ рд╣реИ:

рдмреЗрдВрдбреАрдЯреНрд░реА/рдореЛрдВрдЧреЛрдЬрд╝-рдЗрд╢реНрдпреВ-4513

рдзрдиреНрдпрд╡рд╛рдж @bendytree , рдЖрдкрдХреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рд╛рде рдореИрдВ рднреА рдкреБрди: рдкреЗрд╢ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ:

7) Database connecting...
49) Database connected...
49) Dropping...
57) Creating...
156) FastQuery-A: starting...
166) FastQuery-A: success: 1
1158) SlowQuery: starting...
2158) FastQuery-B: starting...
362165) SlowQuery: failed: MongoError: connection 0 to localhost:27017 timed out
362167) FastQuery-B: failed: MongoError: connection 0 to localhost:27017 timed out
605159) FastQuery-C: starting...
1210149) Giving Up...

рдпрд╣ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдореЗрд░реА рдЬреИрд╕реА рд╣реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣реИ рд▓реЗрдХрд┐рди рд▓рдВрдмреА рдЯрд╛рдЗрдордЖрдЙрдЯ рдЕрд╡рдзрд┐ рдХреЗ рд╕рд╛рде рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рд╕реЗрдЯрдЕрдк рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдЯрд╛рдЗрдордЖрдЙрдЯ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рдиреЗ рдореЗрдВ рдЕрдзрд┐рдХ/рдХрдо рд╕рдордп рд▓рдЧрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рд░ рдХреЛрдИ рдореЗрд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ (рдЬреЛ 10 рдХреА рдиреАрдВрдж рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ) рдХреЗ рд╕рд╛рде рдкреБрди: рдкреЗрд╢ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

@ vkarpov15 рдХреНрдпрд╛ рдЖрдк рдЗрд╕ рдЕрджреНрдпрддрди рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ

рдореИрдВ @bendytree рдХреЗ рд╕рд╛рде repro рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛, рдпрд╣ socketTimeoutMS рдмрд╣реБрдд рдХрдо рдХрд╛ рдорд╛рдорд▓рд╛ рд╣реИред NS

362591) SlowQuery: failed: MongoError: connection 0 to localhost:27017 timed out
362591) FastQuery-B: failed: MongoError: connection 0 to localhost:27017 timed out

рд╕рдВрджреЗрд╢ рдореЛрдВрдЧреЛрдбрдм рдбреНрд░рд╛рдЗрд╡рд░ рдХреЗ рд╕реЙрдХреЗрдЯ рдЯрд╛рдЗрдорд┐рдВрдЧ рдЖрдЙрдЯ рдХреЗ рд╕рдВрдХреЗрдд рд╣реИрдВред mongodb рдбреНрд░рд╛рдЗрд╡рд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ 30 рд╕реЗрдХрдВрдб рдХреЗ рдмрд╛рдж рд╕рдордп рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЗ OS рдореЗрдВ рдПрдХ рд╕реЙрдХреЗрдЯ рдЯрд╛рдЗрдордЖрдЙрдЯ рднреА рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдкрдХреЛ рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рдЗрд╕рд▓рд┐рдП рдЖрдорддреМрд░ рдкрд░ 15 рд╕реЗрдХрдВрдб рд╕реЗ рдЕрдзрд┐рдХ рд╕рдордп рд▓реЗрдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рд╢реНрдиреЛрдВ рд╕реЗ рдмрдЪрдирд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЖрдк socketTimeoutMS рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореЛрдВрдЧреЛрдбрдм рдХреЗ рд╕реЙрдХреЗрдЯ рдЯрд╛рдЗрдордЖрдЙрдЯ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

mongoose.connect(DB_URL, {
  useMongoClient: true,
  autoReconnect: false,
  poolSize: 1,
  socketTimeoutMS: 0
}).catch((err)=>{ log('Connect failed', err); });

рдЙрд╕ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рд╛рде 0 рдкрд░ рд╕реЗрдЯ рд╣реЛрдиреЗ рдкрд░, рдЖрдкрдХреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрд░реА рдорд╢реАрди рдкрд░ рд▓рдЧрднрдЧ рд╕рдлрд▓ рд╣реЛ рдЬрд╛рддреА рд╣реИ, 10 рдорд┐рдирдЯ рдХреА рдХреНрд╡реЗрд░реА рдЕрднреА рднреА рдорд░ рдЬрд╛рддреА рд╣реИ рд▓реЗрдХрд┐рди рдХреЙрд▓рдмреИрдХ рдЬрд╛рд░реА рд░рд╣рддрд╛ рд╣реИ

$ node gh-4513.js 
9) Database connecting...
43) Database connected...
43) Dropping...
53) Creating...
177) FastQuery-A: starting...
189) FastQuery-A: success: 1
1174) SlowQuery: starting...
2174) FastQuery-B: starting...
601181) SlowQuery: failed: MongoError: Interrupted by the host
601182) FastQuery-B: success: 1
605173) FastQuery-C: starting...
605174) FastQuery-C: success: 1

рд▓реЗрдХрд┐рди рдмрд╛рдж рдХреА рдХреНрд╡реЗрд░реА рд╕рдлрд▓ рд╣реЛрддреА рд╣реИред

рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ, рдиреЗрд╡рд▓реЗ рдХреЛ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдПрдХ рдЯрд╛рдЗрдордЖрдЙрдЯ рдШрдЯрдирд╛ рдХрд╛ рдЙрддреНрд╕рд░реНрдЬрди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЙрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдареАрдХ рдХрд░ рджреЗрдВрдЧреЗред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рд╕реЙрдХреЗрдЯрдЯрд╛рдЗрдордЖрдЙрдЯрдПрдордПрд╕ (360000ms рдХреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреЗ рд╕рд╛рде) рдХреЗ рд╕рд╛рде рдХрдиреЗрдХреНрдЯрдЯрд╛рдЗрдордЖрдЙрдЯрдПрдордПрд╕ (30000ms рдХреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреЗ рд╕рд╛рде) рдХреЛ рднреНрд░рдорд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рдпрд╣ рд╕рд▓рд╛рд╣ рджреА рдЬрд╛рддреА рд╣реИ рдХрд┐ рд╕реЙрдХреЗрдЯрдЯрд╛рдЗрдордЖрдЙрдЯрдПрдордПрд╕ рдХреЛ рдбреНрд░рд╛рдЗрд╡рд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ рд╕рдмрд╕реЗ рдзреАрдореЗ рдСрдкрд░реЗрд╢рди рдХреА рд▓рдВрдмрд╛рдИ рд╕реЗ рджреЛ рд╕реЗ рддреАрди рдЧреБрдирд╛ рдЕрдзрд┐рдХ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдП, рд╕реЙрдХреЗрдЯрдЯрд╛рдЗрдордЖрдЙрдЯрдПрдордПрд╕ рдХреЛ 0 рдкрд░ рд╕реЗрдЯ рдХрд░рдиреЗ рдХрд╛ рдорддрд▓рдм рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реЙрдХреЗрдЯ рдЯрд╛рдЗрдордЖрдЙрдЯ рдорд╛рди (http://mongodb.github.io/ рдкрд░ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА) рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реИред рдиреЛрдб-рдореЛрдВрдЧреЛрдбрдм-рджреЗрд╢реА/2.2/рд╕рдВрджрд░реНрдн/рдЕрдХреНрд╕рд░ рдкреВрдЫреЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рд╢реНрди/)ред

рддреЛ рдпрд╣ рдкреНрд░рд╢реНрди рдмрдирд╛ рд░рд╣рддрд╛ рд╣реИ: рдЬрдм рдпрд╣ рд╕реАрдорд╛ (рдирд┐рд╢реНрдЪрд┐рдд рдпрд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ OS рдЯрд╛рдЗрдордЖрдЙрдЯ) рд╣рд┐рдЯ рд╣реЛ рдЬрд╛рддреА рд╣реИ рддреЛ рдпреЗ рдХреЙрд▓рдмреИрдХ рдХреНрдпреЛрдВ рдмрдВрдж рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ?

@ vkarpov15 [email protected] рдХреЗ рд╕рд╛рде, рдЕрдм рдореИрдВ рдЯрд╛рдЗрдордЖрдЙрдЯ рдЗрд╡реЗрдВрдЯ рджреЗрдЦрддрд╛ рд╣реВрдВ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рд╣рд╛рд▓рд╛рдБрдХрд┐ рдЖрдк рдЕрднреА рднреА рдЗрд╕ рдХреЙрд▓рдмреИрдХ рд╕рдорд╕реНрдпрд╛ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ ( @bendytree рдХреА рдореВрд▓ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рддреЗрдЬрд╝ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдЖрдк LONG_QUERY_DURATION_IN_MS рдХреЛ 2000 рдФрд░ рд╕реЙрдХреЗрдЯрдЯрд╛рдЗрдордЖрдЙрдЯрдПрдордПрд╕ рдХреЛ 1000 рдкрд░ рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ)

рдореИрдВрдиреЗ рдХреБрдЫ рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдП рд╣реИрдВ рдФрд░ рдкрд╛рдпрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдиреЗрд╡рд▓рд╛ рдХреЗ рдмрд┐рдирд╛ рднреА рдкреБрди: рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред http://mongodb.github.io/node-mongodb-native/2.2/reference/faq/ рдкрдврд╝рддреЗ рд╕рдордп, рдореБрдЭреЗ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐: Closing the socket forces a reconnect of the driverтАЩs connection pool and introduces latency to any other operations which are queued up

рднрд▓реЗ рд╣реА mongoose.connection.readyState рд╣рдореЗрд╢рд╛ 1 рд╣реЛрддрд╛ рд╣реИ, рдореИрдВрдиреЗ autoReconnect рдХреЛ true , рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдлрд┐рд░ рд╕реЗ рдЪрд▓рд╛рдпрд╛ рдЧрдпрд╛:

8) Database connecting...
47) Database connected...
48) Dropping...
73) Creating...
123) FastQuery-A: starting...
129) FastQuery-A: success: 1
1122) SlowQuery: starting...
2126) FastQuery-B: starting...
3130) Database timeout...
3133) SlowQuery: failed: MongoError: connection 0 to localhost:27017 timed out
3133) FastQuery-B: failed: MongoError: connection 0 to localhost:27017 timed out
6063) Database timeout...
7122) FastQuery-C: starting...
7125) FastQuery-C: success: 1
8129) Database timeout...
11070) Database timeout...
13073) Database timeout...

рддреЛ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреЙрд▓рдмреИрдХ рдСрдЯреЛ рд░реАрдХрдиреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рд╕рд╣реА рдкрд░ рд╕реЗрдЯ рд╣реИ

рдЗрд╕ рд▓реЗрдЦ рдХреЛ рдЖрдЧреЗ рдкрдврд╝рдиреЗ рдкрд░: http://mongodb.github.io/node-mongodb-native/2.0/tutorials/connection_failures/ , рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ рдЯрд╛рдЗрдордЖрдЙрдЯ рдХреЗ рдмрд╛рдж рдХреЙрд▓рдмреИрдХ рдирд╣реАрдВ рд╣реЛрдиреЗ рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдСрдкрд░реЗрд╢рди рд╣реИ рд╕рд░реНрд╡рд░ рдХреЗ рдкреБрди: рдХрдиреЗрдХреНрдЯ рд╣реЛрдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╕рдордп рдмрдлрд╝рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ред

рддреЛ рдореИрдВрдиреЗ autoReconnect рд╡рд╛рдкрд╕ false + bufferMaxEntries рд╕реЗ 0 , рдпрд╣ рдЖрдЙрдЯрдкреБрдЯ рд╣реИ:

8) Database connecting...
51) Database connected...
51) Dropping...
58) Creating...
112) FastQuery-A: starting...
116) FastQuery-A: success: 1
1115) SlowQuery: starting...
2115) FastQuery-B: starting...
3123) Database timeout...
3123) SlowQuery: failed: MongoError: connection 0 to localhost:27017 timed out
3123) FastQuery-B: failed: MongoError: connection 0 to localhost:27017 timed out
7115) FastQuery-C: starting...
7117) FastQuery-C: failed: MongoError: no connection available for operation and number of stored operation > 0

рдЬреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреЙрд▓рдмреИрдХ @bendytree рдХреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдкрд╣рд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдЯреНрд░рд┐рдЧрд░ рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реБрдЖред

@ vkarpov15 рдпрд╣ рдЕрдм рд╣рдореЗрдВ 2 рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рд╕рд╛рде рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реИ:

  • рдХреЛрдИ рдХрдиреЗрдХреНрд╢рди рдИрд╡реЗрдВрдЯ рдХреНрдпреЛрдВ рдЙрддреНрд╕рд░реНрдЬрд┐рдд рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ (рдореИрдВ рдПрдХ рдбрд┐рд╕реНрдХрдиреЗрдХреНрдЯреЗрдб рдИрд╡реЗрдВрдЯ рджреЗрдЦрдиреЗ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реВрдВ)
  • рдЯрд╛рдЗрдордЖрдЙрдЯ рдШрдЯрдирд╛ рдШрдЯрдирд╛ рдЙрддреНрд╕рд░реНрдЬрд┐рдд рд╣реЛрддреА рд░рд╣рддреА рд╣реИ

рдпрд╣рд╛рдБ рдЕрджреНрдпрддрди рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣реИ ( @bendytree рдХреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкрд░ рдЖрдзрд╛рд░рд┐рдд, [email protected] рдФрд░ [email protected]) рдХреЗ рд╕рд╛рде рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛:

const LONG_QUERY_DURATION_IN_MS = 2000;
const DB_URL = 'mongodb://localhost:27017/test_mongoose_callbacks';

const mongoose = require('mongoose');
mongoose.Promise = Promise;

var startTime = new Date().getTime();
var log = (msg) => {
  var seconds = Math.round(new Date().getTime() - startTime);
  console.log(seconds+") "+msg);
};

var Model = mongoose.model('Test', new mongoose.Schema({
  name: { type: String, trim: true, default: 'test' }
}), 'test');

mongoose.connection.on('connecting',   () => { log('Database connecting...'); });
mongoose.connection.on('timeout',      () => { log('Database timeout...'); });
mongoose.connection.on('error',        () => { log('Database error...'); });
mongoose.connection.on('disconnected', () => { log('Database disconnected...'); });

const doRequest = function (title, slow) {
  var logRequest = (msg) => { log(title+": "+msg); };

  logRequest("starting...");
  var filter = slow ? {$where: 'sleep('+LONG_QUERY_DURATION_IN_MS+') || true'} : {};
  Model.count(filter).exec((err, count) => {
    logRequest(err ? "failed: "+err : "success: "+count);
  });
};

mongoose.connection.on('connected', () => {
  log("Database connected...");
 log("Dropping...");
 mongoose.connection.db.dropDatabase(function(){
   log("Creating...");
   Model.create([ {name: 'test1'} ], function(){
      setTimeout(() => { doRequest("FastQuery-A", false); }, 0);
      setTimeout(() => { doRequest("SlowQuery", true);  }, 1000);
      setTimeout(() => { doRequest("FastQuery-B", false); }, 2000);
      setTimeout(() => { doRequest("FastQuery-C", false); }, LONG_QUERY_DURATION_IN_MS+5000);
      setTimeout(() => { log("Giving Up..."); }, LONG_QUERY_DURATION_IN_MS+30000);
    });
  });
});

mongoose.connect(DB_URL, {
  useMongoClient: true,
  autoReconnect: true,
  //bufferMaxEntries: 0, // Uncomment to disable buffering operations 
  poolSize: 1,
  socketTimeoutMS: 1000
}).catch((err)=>{ log('Connect failed', err); });

setInterval(()=>{
  if (mongoose.connection.readyState === 1) return;
  log('Mongoose.readystate = ', mongoose.connection.readyState);
}, 1000);

рд╣рд╛рдБ, рдЖрдк рд╕рд╣реА рдХрд╣ рд░рд╣реЗ рд╣реИрдВ рд╣рдореЗрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмреЗрд╣рддрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред timeout рдШрдЯрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рдорд╛рдорд▓реЗ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИред

'рдбрд┐рд╕реНрдХрдиреЗрдХреНрдЯреЗрдб' рдЙрддреНрд╕рд░реНрдЬрд┐рдд рдирд╣реАрдВ рд╣реЛрдиреЗ рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ 'рдЯрд╛рдЗрдордЖрдЙрдЯ' рдХрд╛ рдЕрд░реНрде рд╣реИ рдПрдХ рд╕реЙрдХреЗрдЯ рдХрд╛ рд╕рдордп рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛, рд╕рдВрдкреВрд░реНрдг рдкреВрд▓ рдирд╣реАрдВред рдиреЗрд╡рд▓рд╛ рдХреЛ рдпрд╣ рдЬрд╛рдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдХрд┐ рдЯрд╛рдЗрдордЖрдЙрдЯ рдШрдЯрдирд╛ рд╣реЛрдиреЗ рдкрд░ рдкреВрд▓ рдореЗрдВ рдХрд┐рддрдиреЗ рд╕реЙрдХреЗрдЯ рдЕрднреА рднреА рдЬреАрд╡рд┐рдд рд╣реИрдВ, рдФрд░ рдореБрдЭреЗ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдЕрдзрд┐рдХ рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдХрд┐ рд╣рдо рдпрд╣ рдХреИрд╕реЗ рдХрд░рддреЗ рд╣реИрдВред

рдЕрдзрд┐рдХ рдЬрд╛рдВрдЪ рдХрд░реЗрдВрдЧреЗ рдХрд┐ рдЯрд╛рдЗрдордЖрдЙрдЯ рдИрд╡реЗрдВрдЯ рдлрд┐рд░ рд╕реЗ рдХреНрдпреЛрдВ рдирд┐рдХрд▓рддрд╛ рд░рд╣рддрд╛ рд╣реИред рдЖрдкрдХреЗ рдзреИрд░реНрдп рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж: +1:

рдореИрдВрдиреЗ рдЗрд╕реЗ рдореЛрдВрдЧреЛрдбрдм рдбреНрд░рд╛рдЗрд╡рд░ рдореЗрдВ рдХреБрдЫ рдмрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЯреНрд░реИрдХ рдХрд┐рдпрд╛: https://github.com/mongodb-js/mongodb-core/pull/215 ред рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдо рдЗрд╕реЗ рдиреЗрд╡рд▓рд╛ рдореЗрдВ рдкреИрдЪ рдХрд░ рд╕рдХреЗрдВ, рд╡рд┐рд▓рдп рдФрд░ рддреИрдирд╛рдд рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрд╕ рдкрд░ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

@ vkarpov15 рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдореИрдВ mongoose.connection.readyState рдЕрдиреБрднрд╡ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬреЛ рдХрднреА рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИред рдХреНрдпрд╛ рдпрд╣ рд╡рд╣реА рдореБрджреНрджрд╛ рд╣реИ?

@ r3wt рдЙрд╕ рдореБрджреНрджреЗ рдХреЛ 4.11.13 рдореЗрдВ рддрдп рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЖрдк рдХрд┐рд╕ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ?

@ vkarpov15 рдореИрдВ рдЕрдкрдиреА рдкреЛрд╕реНрдЯ рдХреЗ рд╕рдордп 4.11.11 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рдерд╛ред рдпрд╣ рдирд┐рд░рд╛рд╢рд╛рдЬрдирдХ рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрд░рд╣ рдХрд╛ рд╕реНрдкрд╖реНрдЯ рдмреБрд░рд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдЙрддреНрдкрд╛рджрди рдореЗрдВ рдШреБрд╕ рд╕рдХрддрд╛ рд╣реИред рд╢рд╛рдпрдж рдХреБрдЫ рдмреЗрд╣рддрд░ рдкрд░реАрдХреНрд╖рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред (рдореИрдВ рдЕрдкрдорд╛рдирдЬрдирдХ рд╣реЛрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдУрдкрди рд╕реЛрд░реНрд╕ рдкреНрд░реЛрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рдмрдирд╛рдП рд░рдЦрдирд╛ рдХрд┐рддрдирд╛ рдХрдард┐рди рд╣реИред рдХрднреА-рдХрднреА рдпрд╣ рдмреЗрдХрд╛рд░ рд╣реЛрддрд╛ рд╣реИ)

@ vkarpov15 рдореИрдВ рдПрдХ рдиреЗрд╡рд▓рд╛ рдкреНрд▓рдЧрдЗрди рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдБред рдХрдиреЗрдХреНрд╢рди рддреИрдпрд╛рд░ рд╣реЛрдиреЗ рддрдХ рдкреНрд▓рдЧрдЗрди рдХреЛ рдмреНрд▓реЙрдХ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЕрдиреНрдпрдерд╛ рдпрд╣ рдХрдиреЗрдХреНрд╢рди (рдХрд╛рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП) рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдореЗрдВ рдЧрддрд┐рд░реЛрдз рдХрд░рддрд╛ рд╣реИред рдХрдиреЗрдХреНрд╢рди рддреИрдпрд╛рд░ рд╣реЛрдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВ рдЬрд┐рд╕ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рд╡рд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реИ:

function ready(){
    console.log('ready()');
    return new Promise((resolve,reject)=>{
        var _int = setInterval(()=>{
            if(mongoose.connection.readyState == 1 || forceReady){
                clearInterval(_int);
                console.log('mongoose connected ready().resolve()')
                resolve();
            }
        },200);
    })
}

рдореИрдВрдиреЗ mongoose.connnection.on('connected') рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реБрдирдиреЗ рдХреА рднреА рдХреЛрд╢рд┐рд╢ рдХреА, рд▓реЗрдХрд┐рди рдЕрдлрд╕реЛрд╕ рдХрд┐ рдпрд╣ рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ред рдПрдХ рдЦрд╛рд▓реА рд╕реНрдерд╛рдкрдирд╛ рдкрд░ рдпрд╣ рдареАрдХ рдХрд╛рдо рдХрд┐рдпрд╛ред рд▓реЗрдХрд┐рди рдЕрдиреНрдп рдиреЗрд╡рд▓рд╛ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдФрд░ рдШрдЯрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рди рд╕реБрдирдиреЗ рдХреЗ рд╕рдВрдпреЛрдЬрди рдХреЗ рд╕рд╛рде, рдпрд╣ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдВ рд╕рдорд╕реНрдпрд╛ рд╣реЛрддреА рд╣реИред рдХрдиреЗрдХреНрд╢рди.рд░реЗрдбреАрд╕реНрдЯреЗрдЯ рд╣рдореЗрд╢рд╛ рдХреЗ рд▓рд┐рдП 0 рд░рд╣рддрд╛ рд╣реИ рдФрд░ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рдИрд╡реЗрдВрдЯ рдХрднреА рдЙрддреНрд╕рд░реНрдЬрд┐рдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореЗрд░реА рд░рд╛рдп рдореЗрдВ require('mongoose') !== require('mongoose') ред рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред

рдЕрд░реНрдерд╛рдд:

  1. рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ require('mongoose')
  2. рдкреНрд▓рдЧрдЗрди рдПрдХ require('mongoose')
  3. рдкреНрд▓рдЧрдЗрди рдмреА require('mongoose')

рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдФрд░ рдкреНрд▓рдЧрдЗрди рдХрдиреЗрдХреНрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдкреНрд▓рдЧрдЗрди рдмреА рдХрднреА рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдХреНрдпрд╛ рдЗрд╕ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд┐рдХрд▓рддрд╛ рд╣реИ?

@ r3wt рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдирд┐рд░рд╛рд╢рд╛рдЬрдирдХ рд╣реИред рд╣рдордиреЗ рддрдм рд╕реЗ рдРрд╕реЗ рдкрд░реАрдХреНрд╖рдг рдЬреЛрдбрд╝реЗ рд╣реИрдВ рдиреЗрд╡рд▓рд╛ рд╕рд╣реА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ ред рдкрд░реЗрд╢рд╛рдиреА рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдЦреЗрдж рд╣реИред

рдХрдиреЗрдХреНрд╢рди рддреИрдпрд╛рд░ рд╣реЛрдиреЗ рддрдХ рдЕрд╡рд░реБрджреНрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, mongoose.connection.on('connected') рдХреЛ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЖрдк рдХрд┐рди рдЕрдиреНрдп рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ? npm list | grep "mongoose" рдЪрд▓рд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ, рдЖрдкрдХрд╛ рдпрд╣ рджрд╛рд╡рд╛ рдХрд┐ require('mongoose') !== require('mongoose') рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХрд╣реАрдВ рди рдХрд╣реАрдВ рдиреЗрд╡рд▓реЗ рдХреЗ рдХрдИ рд╕рдВрд╕реНрдХрд░рдг рд╣реИрдВред

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдкреАрдЫреЗ рдзрдХреЗрд▓рдирд╛ рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдореЛрдВрдЧреЛрдбрдм рдбреНрд░рд╛рдЗрд╡рд░ рдХреЛ рд░рд┐рд╣рд╛ рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП рдЦреЗрдж рд╣реИ рдФрд░ рдЖрдкрдХреЗ рдзреИрд░реНрдп рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж: +1:

@ vkarpov15 рдЗрд╕ рдлрд┐рдХреНрд╕ рдкрд░ рдЖрдкрдХреЗ рдХрд╛рдо рдХреЗ рд▓рд┐рдП рдмрд╕ рдЗрддрдирд╛ рдзрдиреНрдпрд╡рд╛рдж рдХрд╣рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рд╣рдо рдЗрд╕реЗ рдХреБрдЫ рдорд╣реАрдиреЛрдВ рд╕реЗ 0 рдореБрджреНрджреЛрдВ рдХреЗ рд╕рд╛рде рдЙрддреНрдкрд╛рджрди рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

@bendytree рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд░рд┐рдкреНрд░реЛ-рдПрдб рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рдЖрдкрдХреА рддрд░рд╣ рдХреЗ рд╢рдмреНрджреЛрдВ рдФрд░ рдЖрдкрдХреЗ рдзреИрд░реНрдп рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдореЛрдВрдЧреЛрдбрдм рдбреНрд░рд╛рдЗрд╡рд░ рдЯреАрдо рдХреЛ рдореЛрдВрдЧреЛрдбрдм 3.6 рд░рд┐рд▓реАрдЬ рдХреЗ рд▓рд┐рдП рд╕рдордп рдкрд░ 3.0 рд░рд┐рд▓реАрдЬ рдХрд░рдиреЗ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╡реЗ рдЕрднреА рддрдХ рдЗрд╕ рдлрд┐рдХреНрд╕ рдХреЗ рд╕рд╛рде 2.x рд░рд┐рд▓реАрдЬ рдирд╣реАрдВ рдХрд░ рдкрд╛рдП рд╣реИрдВ, рдореИрдВ рдЙрдиреНрд╣реЗрдВ рдлрд┐рд░ рд╕реЗ рдкрд┐рдВрдЧ рдХрд░реВрдВрдЧрд╛ред рдЫреБрдЯреНрдЯрд┐рдпрд╛рдВ рдЖрдирдВрджрджрд╛рдпрдХ рд╣реЛрдВ!

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

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

tarun1793 picture tarun1793  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

jeremyml picture jeremyml  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

CodeurSauvage picture CodeurSauvage  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

varunjayaraman picture varunjayaraman  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

jeneser picture jeneser  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ