ããã€ãã®objectIdãåç §ãšããŠæ¿å ¥ããŠããŸãããããããæå¹ãªobjectidã§ããããšã確èªããããšæããŸãïŒçŸåšãæå¹ãªIDã§ãªãå Žåã¯ã¯ã©ãã·ã¥ããŸãïŒã
findïŒïŒåŒã³åºããå®è¡ããã ãã§ãããããæå¹ãªãªããžã§ã¯ããåç §ããŠãããã©ããã確èªããŠããŸãã
æååãæ£ãã圢åŒã§ãããã©ããã確èªããã«ã¯ã©ãããã°ããã§ããïŒ æååã24æåã®æååã§ãããã©ããããã§ãã¯ããããã€ãã®regexãèŠãããšããããŸããããã®ãããªãã®ã¯ããã¯ã®ããã§ãã ObjectIdã«å éšããªããŒã¿ãŒã¯ãããŸããïŒ äœ¿ãæ¹ãããããŸããã§ããã æ¬åœã«ããããšãïŒ
ç§ãåãåé¡ãæ±ããŠããŸãã mongoose.Schema.ObjectId.isValidïŒïŒãšmongoose.Types.ObjectId.isValidïŒïŒãè©ŠããŸããããã©ã¡ãã®ããããã£ã«ãisValidã¡ãœããããããŸããã ã©ã®ããã«ããŠãã®åé¡ã解決ããã®ã§ããïŒ ãŸããmongodbã«ã¯1ã€ãããå¥ã®ãªãã·ã§ã³ãšããŠæ£èŠè¡šçŸããããŸãã æ£èŠè¡šçŸã䜿çšããããªãããrequireïŒ'mongodb'ïŒããå¿ èŠããããŸãã
ããã¯ç§ã®ããã«åããŸãïŒ
var mongoose = requireïŒ'./ node_modules / mongoose'ïŒ;
console.logïŒmongoose.Types.ObjectId.isValidïŒ;
// [é¢æ°ïŒisValid]
console.logïŒmongoose.Types.ObjectId.isValidïŒ '53cb6b9b4f4ddef1ad47f943'ïŒïŒ;
//true
console.logïŒmongoose.Types.ObjectId.isValidïŒ'bleurgh'ïŒïŒ;
// false
ã¡ãªã¿ã«ãmongodbã®ã¡ãœããã¯bson libã¡ãœããã§ãããnullã§ã¯ãªã12æåãŸãã¯24æåã®16é²æååããã§ãã¯ããŸããããã¯æ¬¡ã®ãããªæ£èŠè¡šçŸã§ãã
var checkForHexRegExp = new RegExpïŒ "^ [0-9a-fA-F] {24} $"ïŒ;
ã ãããããããã§äœ¿ãããŠãããªãããã¯ããŸãããããŒã«ãªãããšã¯ã§ããŸãã
æååã«12æåãå«ãŸããŠããå ŽåãsValidïŒïŒã¯åžžã«Trueãè¿ããŸã
console.logïŒmongoose.Types.ObjectId.isValidïŒ "zzzzzzzzzzzz"ïŒïŒ; //true
ãzzzzzzzzzzzzãã¯æè¡çã«ã¯æå¹ãªObjectIdã§ããããããªããžã§ã¯ãIDã®å¯äžã®å®çŸ©æ©èœã¯ã12ãã€ãã®é·ãã§ãã mongodb / js-bsonïŒ112ãåç
§ããŠãã ããã é·ã12ã®JSæååã¯12ãã€ãã§ãã¢ãžã¥ããŠãã³ãŒãã®å¥åŠããæã£ãŠããŸãã é·ã24ã®16é²æååã確èªããå Žåã¯ãæååã/^[a-fA-F0-9]{24}$/
ãšäžèŽããããšã確èªããŠãã ããã
ãzzzzzzzzzzzzãã¯æå¹ãªObjectIdã§ã¯ãããŸããã ããšãã°ãMongo shell listiongïŒmongodbããŒãžã§ã³-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")
mongodbã·ã§ã«ã®ObjectIdã³ã³ã¹ãã©ã¯ã¿ãŒã¯ã16é²æååã®ã¿ãåãå
¥ããããã«èšè¿°ãããŠããããã§ãã ããã¯ãBSONã¿ã€ãã®ObjectIdã§ã¯ãªãã䟿å®äžã®mongoã·ã§ã«ã®å¶éã§ãã 確ãã«ãããã¯16é²æååãObjectIdã®éåžžã®è¡šçŸæ¹æ³ã§ããããšãèãããšãããçŽæã«åããã±ãŒã¹ã§ããããããæ°ã«å
¥ããªãå Žåã¯ãæ£èŠè¡šçŸ/^[a-fA-F0-9]{24}$/
ã䜿çšããŠãã ãã:)
æååã§ã¯ãªãObjectIdèªäœisValid
ãå®è¡ããããšãããšããªãfalseã«ãªãã®ã§ããïŒ ObjectIdã¯æå¹ãªObjectIdã§ãããããããã¯trueãè¿ãå¿
èŠããããŸããïŒ ããã¯æå³ããããŸãã-ãªããžã§ã¯ããisValid
ã«æž¡ãããŠããå Žåã¯ã .toString()
ãåŒã³åºããŸããïŒ
@niftylettuceã®ã³ã¡ã³ãã¯ïŒ3365ã§æè¿ããŸãã ä»ã®ãšããã bsonããã±ãŒãžã®ObjectId.isValidïŒïŒé¢æ°ã«ä»»ããŠããŸãããããã¯ã人ã ããã³ã°ãŒã¹ã®ObjectIdãã©ã®ããã«èããŠããããšæ£ç¢ºã«ã¯äžèŽããŠããŸããã ãã ããObjectIdãäžããããå Žåã¯ãtrueãè¿ãããã®PRãéããŸãããããã¯å®å šã«åççãªããã§ãã
ããã§å°ãå€ãåé¡ã«æ»ããŸã... @atcwellsãœãªã¥ãŒã·ã§ã³mongoose.Types.ObjectId.isValid('53cb6b9b4f4ddef1ad47f943')
ã¯ç§ã«ãšã£ãŠã¯ååã«æ©èœããŸããããªããžã§ã¯ãIDãæå¹ãã©ãããã³ã³ãããŒã©ãŒã«ãã§ãã¯ãããå¿
èŠãããã®ã¯å°ãããããŒãªããã§ãã確ãã«ãäžæ£ãªåœ¢åŒã®IDããµãŒããŒã«éä¿¡ããã¯ã©ãã·ã¥ãããªãããã«ããããšã¯ãããªãäžè¬çãªäœ¿çšäŸã§ãã
çæ³çã«ã¯ãã³ãŒã«ããã¯ã®err
ã«äœããè¿ãã ãã§ããããæ£ããåŠçããã³ã³ãããŒã©ãŒã䜿çšããŠæ£ããHTTPã¹ããŒã¿ã¹ãéä¿¡ã§ããŸãã
ãããã³ã¢ã®äŸ¿å©ãªæ©èœã§ã¯ãªããŠãŒã¹ã±ãŒã¹ã¯ãããŸããïŒ ããã§ãªãå Žåã¯ããã©ã°ã€ã³ãäœæã§ããå¯èœæ§ããããŸãã ç°¡åã«æ€çŽ¢ããŸããããä»äºãããŠãããã®ã¯äœããªãããã§ãâ https://github.com/CampbellSoftwareSolutions/mongoose-id-validatorã¯ãIDãå®éã«ååšããããšãæ€èšŒããããã®ãã®ã§ãããããã¯ããã§ã¯ãããŸããããã§å®è¡ãããã®ã¯ããã£ãããããªããšã©ãŒãçæãããªãããã«ããããšã ãã§ãã
çŸåšãExpressã³ã³ãããŒã©ãŒã§ã¯ãObjectIdãå«ããªã¯ãšã¹ããéä¿¡ãããã³ã«ãããšãã°GET to httpsïŒ// myproject / Organisations / {id}ãå®è¡ãããã³ã«ã次ã®ãããªæäœãè¡ãå¿ èŠããããŸãã
if( !mongoose.Types.ObjectId.isValid(id) ){
return res.sendStatus(400); // They didn't send an object ID
}
...ãã®åã«Organisation.findOne();
ãå®è¡ããŸã
ããªãå®åçãªããã§ãã 誰ããç§ãã©ãããå§ããã¹ããæ£ããæ¹åã«åããããšãã§ããã°ããã©ã°ã€ã³ãäœããæžããŠããããã§ãã ããã¯å®éã«ã¯ã¹ããŒãã®ãã®ã§ã¯ãªãã®ã§ããã©ã°ã€ã³ã®ããã«ã¯èŠããŸãã...
@shankiesanããå¿ èŠã¯ãããŸãããIDãç¡å¹ãªå Žåãmongooseã¯ã¯ãšãªpromiseãæåŠããŸãã
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
ããããªããŠãããããªãã ïŒ ãã¡ãããæåŠãããçŽæãåŠçããŸã... argãç§ã®è³ã ããããšã@vkarpov15
çŽæãé çã®çš®ã§ããå Žåãã³ãŒã«ããã¯ãæ©èœããŸãMyModel.findOne({ _id: 'invalid' }).exec(error => console.error('error', error));
:)
äžèšã®12ãã€ãã®Valeriãèšã£ãããšãããŸã æããã§ãªãå Žåã¯ã ObjectId.isValid()
ã䜿çšããªãã§ãã ããã ããã§ããªãããããã©ããŸããïŒ
ObjectId.isValid('The Flagship') === true
@atcwellséåžžã«è³æã®ã³ã¡ã³ããæŽæ°ããŠããã®ããããå«ããããšãã§ããã°ãç§ãæåã«ããªãã®èšã£ãããšã«åºã¥ããŠãããè¡ã£ãŠããã®ã§ãä»ã®äººããããé«ãè©äŸ¡ãããããããªããšæããŸãïŒ ObjectId.isValid('The Flagship') === true
é¢çœãéšåã¯æ¬¡ã®ãšããã§ãã
次ã®ã¹ããŒãã¡ã³ãã¯trueãè¿ããŸã
mongoose.Types.ObjectId.isValidïŒ "åã¢ããªã«"ïŒ
ç§ãïŒä»ã®ãšããïŒåãçµãã§ããã®ã¯ãpromisecatchã®ãšã©ãŒã¿ã€ãããã§ãã¯ããããšã§ãã 'ObjectId'ã®å Žåã404ãè¿ãããŸããAPI/ WebãµãŒãã¹ã®ã³ã³ã·ã¥ãŒããŒã«ãªãœãŒã¹ãèŠã€ãããªããååšããªãããã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');
});
ã¹ããŒãã§æ€èšŒããããšã¯å¯èœã§ããïŒ ãããç¹°ãè¿ãã®ã¯ãã¹ããã©ã¯ãã£ã¹ã§ã¯ãããŸãããããã£ã¹ããšã©ãŒã€ãã³ãããã°ã«èšé²ããããšæããŸãã
MongoDBã®ã¿ãåŠçããŠããã®ã«ãisValidã®æ£èŠè¡šçŸ/ ^ [a-fA-F0-9] {24}$/ãmongooseã§å®è£ ã§ããªãã®ã¯ãªãã§ããã ããã¯ãšãŠãçŽããããã§ãã åé¡ã®ãããã°ã«1æéè²»ããã ãã§ãæ°ä»ããªãã»ã©ã°ãããããšãå€æããŸããã
ãã®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()
ã¢ãããŒãã®é©å¿ãè¡ã£ãŠããŸããã ç§ã®ãŠãŒã¹ã±ãŒã¹ã§ã¯ãIDãŸãã¯url-slugã®ããããã§ãªãœãŒã¹ãååŸã§ããããã«ãããã®ã§ã次ã®ããã«ãªããŸãã
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ãã€ãã®æååã¯åŒãç¶ãæå¹ãªãªããžã§ã¯ãIDã§ããããããæ€çŽ¢ãããšããšã©ãŒãã¹ããŒããã®ã§ã¯ãªããé·ãããŒãã®é
åãè¿ãããŸãã ãŸãã $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ïŒãtrueã®å ŽåãïŒ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 = requireïŒ'./ node_modules / mongoose'ïŒ;
console.logïŒmongoose.Types.ObjectId.isValidïŒ;
// [é¢æ°ïŒisValid]
console.logïŒmongoose.Types.ObjectId.isValidïŒ '53cb6b9b4f4ddef1ad47f943'ïŒïŒ;
//true
console.logïŒmongoose.Types.ObjectId.isValidïŒ'bleurgh'ïŒïŒ;
// false