Mongoose: рдСрдмреНрдЬреЗрдХреНрдЯ рдЖрдИрдбреА рдХреЛ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛

рдХреЛ рдирд┐рд░реНрдорд┐рдд 12 рдорд╛рд░реНрдЪ 2014  ┬╖  29рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: Automattic/mongoose

рдореИрдВ рд╕рдВрджрд░реНрдн рдХреЗ рд░реВрдк рдореЗрдВ рдХреБрдЫ рдСрдмреНрдЬреЗрдХреНрдЯ рдЖрдИрдбреА рдбрд╛рд▓ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдореИрдВ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рд╡реЗ рд╡реИрдз рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИрдВ (рдЕрднреА рдЬрдм рд╡реЗ рд╡реИрдз рдЖрдИрдбреА рдирд╣реАрдВ рд╣реИрдВ рддреЛ рдореБрдЭреЗ рдХреНрд░реИрд╢ рд╣реЛ рд░рд╣рд╛ рд╣реИ)ред

рдореИрдВ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдВрдЪ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдХреНрдпрд╛ рд╡реЗ рдХреЗрд╡рд▓ рдПрдХ рдЦреЛрдЬ() рдХреЙрд▓ рдХрд░рдХреЗ рд╡реИрдз рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рд╕рдВрджрд░реНрдн рд▓реЗрддреЗ рд╣реИрдВред

рдореБрдЭреЗ рдХреИрд╕реЗ рдЬрд╛рдВрдЪрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рддрд╛рд░ рд╕рд╣реА рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд╣реИрдВ рдпрд╛ рдирд╣реАрдВ? рдореИрдВрдиреЗ рдХреБрдЫ рд░реЗрдЧреЗрдХреНрд╕ рджреЗрдЦреЗ рд╣реИрдВ рдЬреЛ рдЬрд╛рдВрдЪрддреЗ рд╣реИрдВ рдХрд┐ рд╕реНрдЯреНрд░рд┐рдВрдЧ 24 рд╡рд░реНрдг рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реИ рдФрд░ рдЙрд╕ рддрд░рд╣ рдХреА рдЪреАрдЬреЗрдВ - рдПрдХ рд╣реИрдХ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИред рдХреНрдпрд╛ ObjectId рдкрд░ рдХреЛрдИ рдЖрдВрддрд░рд┐рдХ рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рд╣реИ? рдореБрдЭреЗ рд╕рдордЭ рдирд╣реАрдВ рдЖ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдПред рдмрд╣реБрдд рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж!

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

рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:

var mongoose = рдЖрд╡рд╢реНрдпрдХрддрд╛ ('./node_modules/mongoose');
рдХрдВрд╕реЛрд▓.рд▓реЙрдЧ (mongoose.Types.ObjectId.isValid);
// [рдлрд╝рдВрдХреНрд╢рди: рдорд╛рдиреНрдп рд╣реИ]
console.log(mongoose.Types.ObjectId.isValid('53cb6b9b4f4ddef1ad47f943'));
// рд╕рдЪ
console.log(mongoose.Types.ObjectId.isValid('bleurgh'));
// рдЕрд╕рддреНрдп

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

рдореБрдЭреЗ рднреА рдпрд╣реА рддрдХрд▓реАрдлрд╝ рд╣реИред рдореИрдВрдиреЗ mongoose.Schema.ObjectId.isValid() рдХреЗ рд╕рд╛рде-рд╕рд╛рде mongoose.Types.ObjectId.isValid() рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рд▓реЗрдХрд┐рди рдЙрди рдЧреБрдгреЛрдВ рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдореЗрдВ рднреА isValid рд╡рд┐рдзрд┐ рдирд╣реАрдВ рд╣реИред рдЖрдЦрд┐рд░ рдЖрдкрдиреЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХреИрд╕реЗ рдирд┐рдХрд╛рд▓рд╛? рдореИрдВ рдпрд╣ рднреА рджреЗрдЦрддрд╛ рд╣реВрдВ рдХрд┐ рдореЛрдВрдЧреЛрдбрдм рдореЗрдВ рдПрдХ рд╣реИ рдФрд░ рдПрдХ рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ рд░реЗрдЧреЗрдХреНрд╕ рднреА рд╣реИред рдореИрдВ рд░реЗрдЧреЗрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ рдФрд░ рди рд╣реА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА ('рдореЛрдВрдЧреЛрдбрдм')

рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:

var mongoose = рдЖрд╡рд╢реНрдпрдХрддрд╛ ('./node_modules/mongoose');
рдХрдВрд╕реЛрд▓.рд▓реЙрдЧ (mongoose.Types.ObjectId.isValid);
// [рдлрд╝рдВрдХреНрд╢рди: рдорд╛рдиреНрдп рд╣реИ]
console.log(mongoose.Types.ObjectId.isValid('53cb6b9b4f4ddef1ad47f943'));
// рд╕рдЪ
console.log(mongoose.Types.ObjectId.isValid('bleurgh'));
// рдЕрд╕рддреНрдп

рд╕рдВрдпреЛрдЧ рд╕реЗ mongodb рдореЗрдВ рд╡рд┐рдзрд┐ bson lib рд╡рд┐рдзрд┐ рд╣реИ, рдЬреЛ рдХреЗрд╡рд▓ рд╢реВрдиреНрдп, 12 рдпрд╛ 24 рдЪрд╛рд░ рд╣реЗрдХреНрд╕ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреА рдЬрд╛рдВрдЪ рдирд╣реАрдВ рдХрд░рддреА рд╣реИ - рдпрд╣ рдЗрд╕ рддрд░рд╣ рдПрдХ рд░реЗрдЧреЗрдХреНрд╕ рд╣реИ:

var checkForHexRegExp = рдирдпрд╛ RegExp ("^ [0-9a-fA-F] {24}$");

рддреЛ рдпрд╣ рдмрд╣реБрдд рд╣реИрдХреА рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЕрдЧрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рд╣рд╛рдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ

sValid () рд╣рдореЗрд╢рд╛ рд╕рд╣реА рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдпрджрд┐ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ 12 рдЕрдХреНрд╖рд░ рд╣реИрдВ

console.log(mongoose.Types.ObjectId.isValid("zzzzzzzzzzzz")); // рд╕рдЪ

рдЪреВрдВрдХрд┐ "zzzzzzzzzzzz" рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ рдПрдХ рд╡реИрдз рдСрдмреНрдЬреЗрдХреНрдЯ рдЖрдИрдбреА рд╣реИ - рдСрдмреНрдЬреЗрдХреНрдЯ рдЖрдИрдбреА рдХреА рдПрдХрдорд╛рддреНрд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡рд┐рд╢реЗрд╖рддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕рдХреА 12 рдмрд╛рдЗрдЯ рд▓рдВрдмреА рд╣реИред рджреЗрдЦреЗрдВ mongodb/js-bson#112. рд▓рдВрдмрд╛рдИ 12 рдХреА рдПрдХ рдЬреЗрдПрд╕ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ 12 рдмрд╛рдЗрдЯреНрд╕ рд╣реИрдВ, рдореЙрдбреНрдпреВрд▓реЛ рдпреВрдирд┐рдХреЛрдб рдЕрдЬреАрдмрддрд╛рдПрдВ рд╣реИрдВред рдпрджрд┐ рдЖрдк рд▓рдВрдмрд╛рдИ 24 рд╣реЗрдХреНрд╕ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдмрд╕ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдорд┐рд▓рд╛рди /^[a-fA-F0-9]{24}$/ . рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВ

"zzzzzzzzzzzz" рдорд╛рдиреНрдп рдСрдмреНрдЬреЗрдХреНрдЯ рдЖрдИрдбреА рдирд╣реАрдВ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП Mongo shell listiong (рдореЛрдВрдЧреЛрдбрдм рд╕рдВрд╕реНрдХрд░рдг - 3.0.2):

> ObjectId('zzzzzzzzzzzz')
2015-04-29T18:05:20.705+0300 E QUERY    Error: invalid object id: length
    at (shell):1:1
> ObjectId('zzzzzzzzzzzzzzzzzzzzzzzz')
2015-04-29T18:06:09.773+0300 E QUERY    Error: invalid object id: not hex
    at (shell):1:1
> ObjectId('ffffffffffff')
2015-04-29T18:09:17.303+0300 E QUERY    Error: invalid object id: length
    at (shell):1:1
> ObjectId('ffffffffffffffffffffffff')
ObjectId("ffffffffffffffffffffffff")

рдХреНрдпреЛрдВрдХрд┐ рдореЛрдВрдЧреЛрдбрдм рд╢реЗрд▓ рдХрд╛ рдСрдмреНрдЬреЗрдХреНрдЯрдЖрдИрдбреА рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдРрд╕рд╛ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рд╣реЗрдХреНрд╕ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдореЛрдВрдЧреЛ рдЦреЛрд▓ рдореЗрдВ рдкреНрд░рддрд┐рдмрдВрдз рд╣реИ, рдмреАрдПрд╕рдУрдПрди рдкреНрд░рдХрд╛рд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдЖрдИрдбреА рдХреЗ рд╕рд╛рде рдирд╣реАрдВред рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреБрдЫ рд╣рдж рддрдХ рдкреНрд░рддрд┐рдХреВрд▓ рдорд╛рдорд▓рд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣реЗрдХреНрд╕ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдЖрдорддреМрд░ рдкрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдЖрдИрдбреА рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреА рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдкрдХреЛ рдпрд╣ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ рддреЛ рдмрд╕ рд░реЗрдЧреЗрдХреНрд╕ /^[a-fA-F0-9]{24}$/ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ :)

рдЬрдм рд╣рдо рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдЖрдИрдбреА рдкрд░ isValid рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рди рдХрд┐ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкрд░ рдХреНрдпреЛрдВ рд╣рдо рдЭреВрдард╛ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ? рдХреНрдпрд╛ рдпрд╣ рд╕рдЪ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ ObjectId рдПрдХ рд╡реИрдз ObjectId рд╣реИ? рдЗрд╕рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ - рд╢рд╛рдпрдж .toString() рдкрд░ рдХреЙрд▓ рдХрд░реЗрдВ рдпрджрд┐ рдпрд╣ рдПрдХ рд╡рд╕реНрддреБ isValid рдкрд░ рдкрд╛рд╕ рдХреА рдЬрд╛ рд░рд╣реА рд╣реИ?

@niftylettuce рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХрд╛ #3365 рдкрд░ рд╕реНрд╡рд╛рдЧрдд рд╣реИред рдЕрднреА рд╣рдо рдмрд╕ bson рдкреИрдХреЗрдЬ рдХреЗ ObjectId.isValid() рдлрдВрдХреНрд╢рди рдХреЛ рдЯрд╛рд▓ рджреЗрддреЗ рд╣реИрдВ, рдЬреЛ mongoose рдореЗрдВ ObjectIds рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓реЛрдЧреЛрдВ рдХреЗ рд╡рд┐рдЪрд╛рд░ рд╕реЗ рдмрд┐рд▓реНрдХреБрд▓ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддрд╛ред рдЕрдЧрд░ рдЖрдкрдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдЖрдИрдбреА рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдореИрдВ рд╕рдЪ рд▓реМрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреАрдЖрд░ рдЦреЛрд▓реВрдВрдЧрд╛, рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЙрдЪрд┐рдд рд▓рдЧрддрд╛ рд╣реИред

рдпрд╣рд╛рдВ рдПрдХ рдкреБрд░рд╛рдиреЗ рдореБрджреНрджреЗ рдкрд░ рд╡рд╛рдкрд╕ рдЖ рд░рд╣рд╛ рд╣реИ ... @atcwells рд╕рдорд╛рдзрд╛рди mongoose.Types.ObjectId.isValid('53cb6b9b4f4ddef1ad47f943') рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдлреА рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрднреА рднреА рдереЛрдбрд╝рд╛ рд╣реИрдХреА рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореЗрд░реЗ рдирд┐рдпрдВрддреНрд░рдХ рдХреЛ рдЬрд╛рдВрдЪрдирд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рдСрдмреНрдЬреЗрдХреНрдЯ рдЖрдИрдбреА рдорд╛рдиреНрдп рд╣реИ рдпрд╛ рдирд╣реАрдВ - рдЬрдм рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдпрд╣ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рд╣реИ рдЬреЛ рд╕рд░реНрд╡рд░ рдкрд░ рдПрдХ рдЦрд░рд╛рдм-рдирд┐рд░реНрдорд┐рдд рдЖрдИрдбреА рднреЗрдЬрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдХреНрд░реИрд╢ рдирд╣реАрдВ рдХрд░рдирд╛ рд╣реИред

рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ, рдпрд╣ рдХреЙрд▓рдмреИрдХ рдореЗрдВ err рдореЗрдВ рдмрд╕ рдХреБрдЫ рд▓реМрдЯрд╛рдПрдЧрд╛ рддрд╛рдХрд┐ рд╣рдо рдЗрд╕реЗ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рд╕рдВрднрд╛рд▓ рд╕рдХреЗрдВ рдФрд░ рд╣рдорд╛рд░реЗ рдирд┐рдпрдВрддреНрд░рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рд╣реА HTTP рд╕реНрдерд┐рддрд┐ рднреЗрдЬ рд╕рдХреЗрдВред

рдХреНрдпрд╛ рдХреЛрдИ рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓рд╛ рд╣реИ рдЬрд╣рд╛рдВ рдпрд╣ рдХреЛрд░ рдореЗрдВ рдЙрдкрдпреЛрдЧреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреА ? рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рд╢рд╛рдпрдж рд╣рдо рдПрдХ рдкреНрд▓рдЧрдЗрди рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВрдиреЗ рдПрдХ рддреНрд╡рд░рд┐рдд рдЦреЛрдЬ рдХреА рд╣реИ рдФрд░ рдРрд╕рд╛ рдХреБрдЫ рднреА рдкреНрд░рддреАрдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ - https://github.com/CampbellSoftwareSolutions/mongoose-id-validator рдпрд╣ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ рдХрд┐ рдЖрдИрдбреА рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореМрдЬреВрдж рд╣реИ, рдЬреЛ рдХрд┐ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рд╣рдо рдпрд╣рд╛рдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ - рд╣рдо рдХреЗрд╡рд▓ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдХреЛрдИ рдЕрдирдХрд╣реА рддреНрд░реБрдЯрд┐ рдЙрддреНрдкрдиреНрди рди рдХрд░реЗрдВред

рдЕрднреА, рдореЗрд░реЗ рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдирд┐рдпрдВрддреНрд░рдХ рдореЗрдВ, рд╣рд░ рдмрд╛рд░ рдЬрдм рдореИрдВ рдПрдХ рдЕрдиреБрд░реЛрдз рдкрд░ рдЬрд╛рддрд╛ рд╣реВрдВ рдЬрд┐рд╕рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдЖрдИрдбреА рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП https://myproject/organisations/ {id} рдкрд░ рдЬрд╛рдПрдВ, рдореБрдЭреЗ рдХреБрдЫ рдРрд╕рд╛ рдХрд░рдирд╛ рд╣реИ:

if( !mongoose.Types.ObjectId.isValid(id) ){
    return res.sendStatus(400); // They didn't send an object ID
  }

... рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ Organisation.findOne(); . рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ

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

@shankiesan рдЖрдкрдХреЛ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЖрдИрдбреА рдЕрдорд╛рдиреНрдп рд╣реЛрдиреЗ рдкрд░ рдиреЗрд╡рд▓рд╛ рдХреНрд╡реЗрд░реА рд╡рд╛рджреЗ рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рджреЗрдЧрд╛ред

var assert = require('assert');
var mongoose = require('mongoose');
var Schema = mongoose.Schema;

mongoose.connect('mongodb://localhost/test');
mongoose.set('debug', true);

var MyModel = mongoose.model('test', new Schema({ name: String }));

MyModel.findOne({ _id: 'invalid' }).exec().catch(error => console.error('error', error));

рдЖрдЙрдЯрдкреБрдЯ:

$ node gh-1959.js 
error { CastError: Cast to ObjectId failed for value "invalid" at path "_id"
    at MongooseError.CastError (/home/val/Workspace/10gen/troubleshoot-mongoose/node_modules/mongoose/lib/error/cast.js:19:11)
    at ObjectId.cast (/home/val/Workspace/10gen/troubleshoot-mongoose/node_modules/mongoose/lib/schema/objectid.js:147:13)
    at ObjectId.castForQuery (/home/val/Workspace/10gen/troubleshoot-mongoose/node_modules/mongoose/lib/schema/objectid.js:187:15)
    at cast (/home/val/Workspace/10gen/troubleshoot-mongoose/node_modules/mongoose/lib/cast.js:174:32)
    at Query.cast (/home/val/Workspace/10gen/troubleshoot-mongoose/node_modules/mongoose/lib/query.js:2563:10)
    at Query.findOne (/home/val/Workspace/10gen/troubleshoot-mongoose/node_modules/mongoose/lib/query.js:1239:10)
    at /home/val/Workspace/10gen/troubleshoot-mongoose/node_modules/mongoose/lib/query.js:2163:21
    at new Promise.ES6 (/home/val/Workspace/10gen/troubleshoot-mongoose/node_modules/mongoose/lib/promise.js:45:3)
    at Query.exec (/home/val/Workspace/10gen/troubleshoot-mongoose/node_modules/mongoose/lib/query.js:2156:10)
    at Object.<anonymous> (/home/val/Workspace/10gen/troubleshoot-mongoose/gh-1959.js:10:37)
    at Module._compile (module.js:570:32)
    at Object.Module._extensions..js (module.js:579:10)
    at Module.load (module.js:487:32)
    at tryModuleLoad (module.js:446:12)
    at Function.Module._load (module.js:438:3)
    at Module.runMain (module.js:604:10)
  message: 'Cast to ObjectId failed for value "invalid" at path "_id"',
  name: 'CastError',
  kind: 'ObjectId',
  value: 'invalid',
  path: '_id',
  reason: undefined }
^C
$ 

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкреБрди: рдкреНрд▓рдЧрдЗрдиреНрд╕ http://thecodebarbarian.com/2015/03/06/guide-to-mongoose-plugins

рдЖрд╣ рдореИрдВ рдХреНрдпрд╛ рдХрдардкреБрддрд▓реА рд░рд╣рд╛ рд╣реВрдБ! рдмреЗрд╢рдХ, рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ рд╡рд╛рджреЗ рдХреЛ рд╕рдВрднрд╛рд▓реЛ ... рддрд░реНрдХ, рдореЗрд░реЗ рджрд┐рдорд╛рдЧред рдзрдиреНрдпрд╡рд╛рдж @vkarpov15

рдХреЙрд▓рдмреИрдХ рднреА рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рдпрджрд┐ рд╡рд╛рджреЗ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕рд┐рд░рджрд░реНрдж рд╣реИрдВ MyModel.findOne({ _id: 'invalid' }).exec(error => console.error('error', error)); :)

ObjectId.isValid() рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВ рдпрджрд┐ рдпрд╣ рдЙрдкрд░реЛрдХреНрдд 12 рдмрд╛рдЗрдЯреНрд╕ рд╕реЗ рдкрд╣рд▓реЗ рд╕реЗ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рддреЛ рд╡реИрд▓реЗрд░реА рдиреЗ рдХрд╣рд╛ред рдмрд╕ рдЗрд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдЬрд▓ рдЧрдпрд╛:
ObjectId.isValid('The Flagship') === true

@atcwells рдЕрдЧрд░ рдЖрдк рдЙрд╕ рдмрд┐рдЯ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рдЕрддреНрдпрдзрд┐рдХ рдЙрддреНрдерд╛рди рд╡рд╛рд▓реА рдЯрд┐рдкреНрдкрдгреА рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдиреНрдп рд▓реЛрдЧ рдЗрд╕рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рд╢реБрд░реБрдЖрдд рдореЗрдВ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдХрд╣реА рдЧрдИ рдмрд╛рддреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХрд░ рд░рд╣рд╛ рдерд╛: ObjectId.isValid('The Flagship') === true

рдордЬреЗрджрд╛рд░ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ:
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрдерди рд╕рддреНрдп рд▓реМрдЯ рд░рд╣рд╛ рд╣реИ
mongoose.Types.ObjectId.isValid("рджрдХреНрд╖рд┐рдг рдЕрдлреНрд░реАрдХрд╛")

рдореИрдВ рдХрд┐рд╕рдХреЗ рд╕рд╛рде рдЪрд▓ рд░рд╣рд╛ рд╣реВрдВ (рдЕрднреА рдХреЗ рд▓рд┐рдП) рд╡рд╛рджрд╛ рдкрдХрдбрд╝рдиреЗ рдореЗрдВ рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд░рд╣рд╛ рд╣реИред рдпрджрд┐ рдпрд╣ 'рдСрдмреНрдЬреЗрдХреНрдЯрдЖрдИрдб' рд╣реИ рддреЛ рдореБрдЭреЗ 404 рд▓реМрдЯрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдореИрдВ 404 рд▓реМрдЯрд╛ рд░рд╣рд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдПрдкреАрдЖрдИ/рд╡реЗрдм рд╕реЗрд╡рд╛ рдХреЗ рдЙрдкрднреЛрдХреНрддрд╛ рдХреЛ рд╕рдВрд╕рд╛рдзрди рдирд╣реАрдВ рдорд┐рд▓рд╛ рдерд╛ рдпрд╛ рдореМрдЬреВрдж рдирд╣реАрдВ рдерд╛ред

рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВ:

  Widget.findByIdAndRemove(resourceId)
    .then((result) => {
      if (!result) {
        let error = new Error('Resource not found');
        error.status = 404;
        next(error);
      } else {
        res.redirect(303, '/');
      }
    })
    .catch((error) => {
      if (error.kind === 'ObjectId') {
        let error = new Error('Resource not found');
        error.status = 404;

        next(error);
      } else {
        next(error);
      }
    });

рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ:
рдирд┐рдпрдВрддреНрд░рдХ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рд░реВрдЯ рд╣реИрдВрдбрд▓рд░ рдореЗрдВ рдЗрд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрдЬрд╛рдпред рдореИрдВ рд╕рднреА рд╣реИрдВрдбрд▓рд░ рдХреЛ рдЧреНрд▓реЛрдмрд▓ рдХреИрдЪ рдореЗрдВ рдЬреЛрдбрд╝ рд░рд╣рд╛ рд╣реВрдВред

рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВ:

app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  if (err.kind === 'ObjectId') {
    err.status = 404;
  }

  // render the error page
  res.status(err.status || 500);
  res.render('error');
});

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

рдореЛрдВрдЧреЛрдЬрд╝ рд░реЗрдЧреЗрдХреНрд╕ /^[a-fA-F0-9]{24}$/ рдХреЛ isValid рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рдпрд╣ рдХреЗрд╡рд▓ MongoDB рд╕реЗ рдирд┐рдкрдЯ рд░рд╣рд╛ рд╣реИред рдпрд╣ рдмрд╣реБрдд рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИред рд╣рдо рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдбрд┐рдмрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рд┐рд░реНрдл рдПрдХ рдШрдВрдЯрд╛ рдмрд┐рддрд╛рддреЗ рд╣реИрдВ рдФрд░ рдпрд╣ рдЗрддрдиреА рдореВрд░реНрдЦрддрд╛рдкреВрд░реНрдг рдмрд╛рдд рдирд┐рдХрд▓реА рдХрд┐ рдЖрдк рдХрднреА рдиреЛрдЯрд┐рд╕ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ

рдореИрдВ рдЗрд╕ npm рдкреИрдХреЗрдЬ https://www.npmjs.com/package/valid-objectid рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреВрдВрдЧрд╛
рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ

рдореИрдВрдиреЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдмрдирд╛рдпрд╛ рд╣реИ:

function isObjectId(value) {
  try {
      const { ObjectId } = mongoose.Types;
      const asString = value.toString(); // value is either ObjectId or string or anything
      const asObjectId = new ObjectId(asString);
      const asStringifiedObjectId = asObjectId.toString();
      return asString === asStringifiedObjectId;
    } catch (error) {
      return false;
    }
}

@mstmustisnt рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреЛрд╢рд┐рд╢/рдкрдХрдбрд╝рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рдЕрдЧрд░ рдорд╛рди "123" рд╣реИ рддреЛ рдпрд╣ рдПрдХ рддреНрд░реБрдЯрд┐ рдлреЗрдВрдХ рджреЗрдЧрд╛ред

рдЕрдЧрд░ рдпрд╣ рдХрд┐рд╕реА рдХреА рдорджрдж рдХрд░рддрд╛ рд╣реИ, рддреЛ рдореИрдВ рдКрдкрд░ рджрд┐рдП рдЧрдП ObjectId.isValid() рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЕрдиреБрдХреВрд▓рди рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдХреНрдпреЛрдВрдХрд┐ рдореЗрд░реЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореИрдВ рдЕрдкрдиреА рдЖрдИрдбреА рдпрд╛ рдЙрд╕рдХреЗ рдпреВрдЖрд░рдПрд▓-рд╕реНрд▓рдЧ рджреНрд╡рд╛рд░рд╛ рд╕рдВрд╕рд╛рдзрди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

GET /users/59f5e7257a92d900168ce49a ... рдпрд╛ ...
GET /users/andrew-shankie

... рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдореЗрд░реЗ рдирд┐рдпрдВрддреНрд░рдХ рдореЗрдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:

  const { id } = req.params;

  const query = {
    $or: [{ slug: id }],
  };

  if (mongoose.Types.ObjectId.isValid(id)) query.$or.push({ _id: id });

  User.findOne(query)
    .exec((err, user) => { ... }

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдПрдХ 12-рдмрд╛рдЗрдЯ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЕрднреА рднреА рдПрдХ рд╡реИрдз рдСрдмреНрдЬреЗрдХреНрдЯ рдЖрдИрдбреА рд╣реИ, рдЗрд╕рдХреА рдЦреЛрдЬ рдХрд░рдиреЗ рд╕реЗ рддреНрд░реБрдЯрд┐ рдХреЛ рдлреЗрдВрдХрдиреЗ рдХреЗ рдмрдЬрд╛рдп рдХреЗрд╡рд▓ рд╢реВрдиреНрдп-рд▓рдВрдмрд╛рдИ рд╡рд╛рд▓реА рд╕рд░рдгреА рдорд┐рд▓рддреА рд╣реИред рдФрд░ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдПрдХ $or рдХреНрд╡реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдпрд╣ рддрдм URL рд╕реНрд▓рдЧ (рдореЗрд░рд╛ рдЕрдиреНрдп рд╕рдВрднрд╛рд╡рд┐рдд рд╡рд┐рдХрд▓реНрдк) рджреНрд╡рд╛рд░рд╛ рдЦреЛрдЬ рдХрд░рддрд╛ рд╣реИред

рд╕рдмрд╕реЗ рд╕реБрдВрджрд░ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

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

Validator.js рдореЗрдВ рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд isMongoId рд╡рд┐рдзрд┐ рд╣реИ

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

const mongoose = require('mongoose');
const {Types: {ObjectId}} = mongoose;

//Helper to check if an ID is an object ID
mongoose.isObjectId = function(id) {
  return (id instanceof ObjectId);
};

//Helper to validate a string as object ID
mongoose.isValidObjectId = function(str) {
  if (typeof str !== 'string') {
    return false;
  }
  return str.match(/^[a-f\d]{24}$/i);
};

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

рдпрджрд┐ ObjectId.isValid(id) рд╕рддреНрдп рд╣реИ, рддреЛ рд╣рдо (new ObjectId(id).toString()) рдХреЗ рдорд╛рди рдФрд░ id рдХреЛ рдЖрдВрдХ рд╕рдХрддреЗ рд╣реИрдВред

const mongoose = require('mongoose');
const {Types: {ObjectId}} = mongoose;
const validateObjectId = (id) => ObjectId.isValid(id) && (new ObjectId(id)).toString() === id;
рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

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

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

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

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

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

rohan-paul picture rohan-paul  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ