рдореИрдВ рд╕рдВрджрд░реНрдн рдХреЗ рд░реВрдк рдореЗрдВ рдХреБрдЫ рдСрдмреНрдЬреЗрдХреНрдЯ рдЖрдИрдбреА рдбрд╛рд▓ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдореИрдВ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рд╡реЗ рд╡реИрдз рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИрдВ (рдЕрднреА рдЬрдм рд╡реЗ рд╡реИрдз рдЖрдИрдбреА рдирд╣реАрдВ рд╣реИрдВ рддреЛ рдореБрдЭреЗ рдХреНрд░реИрд╢ рд╣реЛ рд░рд╣рд╛ рд╣реИ)ред
рдореИрдВ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдВрдЪ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдХреНрдпрд╛ рд╡реЗ рдХреЗрд╡рд▓ рдПрдХ рдЦреЛрдЬ() рдХреЙрд▓ рдХрд░рдХреЗ рд╡реИрдз рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рд╕рдВрджрд░реНрдн рд▓реЗрддреЗ рд╣реИрдВред
рдореБрдЭреЗ рдХреИрд╕реЗ рдЬрд╛рдВрдЪрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рддрд╛рд░ рд╕рд╣реА рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд╣реИрдВ рдпрд╛ рдирд╣реАрдВ? рдореИрдВрдиреЗ рдХреБрдЫ рд░реЗрдЧреЗрдХреНрд╕ рджреЗрдЦреЗ рд╣реИрдВ рдЬреЛ рдЬрд╛рдВрдЪрддреЗ рд╣реИрдВ рдХрд┐ рд╕реНрдЯреНрд░рд┐рдВрдЧ 24 рд╡рд░реНрдг рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реИ рдФрд░ рдЙрд╕ рддрд░рд╣ рдХреА рдЪреАрдЬреЗрдВ - рдПрдХ рд╣реИрдХ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИред рдХреНрдпрд╛ ObjectId рдкрд░ рдХреЛрдИ рдЖрдВрддрд░рд┐рдХ рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рд╣реИ? рдореБрдЭреЗ рд╕рдордЭ рдирд╣реАрдВ рдЖ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдПред рдмрд╣реБрдд рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж!
рдореБрдЭреЗ рднреА рдпрд╣реА рддрдХрд▓реАрдлрд╝ рд╣реИред рдореИрдВрдиреЗ 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;
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:
var mongoose = рдЖрд╡рд╢реНрдпрдХрддрд╛ ('./node_modules/mongoose');
рдХрдВрд╕реЛрд▓.рд▓реЙрдЧ (mongoose.Types.ObjectId.isValid);
// [рдлрд╝рдВрдХреНрд╢рди: рдорд╛рдиреНрдп рд╣реИ]
console.log(mongoose.Types.ObjectId.isValid('53cb6b9b4f4ddef1ad47f943'));
// рд╕рдЪ
console.log(mongoose.Types.ObjectId.isValid('bleurgh'));
// рдЕрд╕рддреНрдп