148 votes

Puis-je déterminer si une chaîne de caractères est un ObjectID MongoDB ?

Je fais des recherches dans MongoDB en convertissant une chaîne de caractères en BSON. Existe-t-il un moyen de déterminer si la chaîne que j'ai est un ObjectID valide pour Mongo avant d'effectuer la conversion ?

Voici le coffeescript de ma fonction findByID actuelle. Elle fonctionne très bien, mais j'aimerais pouvoir effectuer une recherche par un autre attribut si je détermine que la chaîne n'est pas un ID.

db.collection "pages", (err, collection) ->
  collection.findOne
    _id: new BSON.ObjectID(id)
  , (err, item) ->
    if item
      res.send item
    else
      res.send 404

1voto

Raz Points 551

Le moyen le plus simple est d'envelopper votre méthode ObjectId dans un service try and catch. Vous utilisez alors ce service pour gérer les identifiants d'objets, au lieu d'utiliser directement la méthode :

var ObjectId = REQUIRE OR IMPORT ...

// service
function oid(str) {
 try {   
   return ObjectId(str);
 } catch(err) {
   return false;
 }
}

// usage
if (oid(USER_INPUT)) {
  // continue
} else {
  // throw error
}

Vous pouvez également envoyer des props nuls ou vides pour obtenir un nouvel ID généré.

1voto

Mattia Rasulo Points 785

La réponse de @ross-u est juste incroyable.

J'ai enchaîné les méthodes pour effectuer une validation complète en ligne :

documentId = id && isValid(id) && new ObjectId(id) == id ? id : null

Notez le double signe égal, qui est TRÈS important car new ObjectId() ne renvoie pas une chaîne de caractères et la comparaison stricte renverra faux lorsqu'elle sera comparée à une chaîne de caractères normale (ce que j'avais prévu dans ma logique).

Les méthodes ont été déstructurées à partir du mongoose objet exposé par le besoin :

const {
  Types: {
    ObjectId: { isValid },
    ObjectId
  }
} = require("mongoose");

1voto

Ramesh Murugesan Points 1930

Cette approche peut aider quelqu'un. Il fonctionne avec le pilote nodejs mongodb

if (ObjectId.isValid(stringId) && (ObjectId(stringId).toString() === stringId)){
  // your operation
}

0voto

pkarc Points 357

Si vous avez la chaîne hexagonale, vous pouvez utiliser ceci :

ObjectId.isValid(ObjectId.createFromHexString(hexId));

0voto

0112358 Points 111

Il m'a fallu un certain temps pour trouver une solution valable, car celle proposée par @Andy Macleod, qui consiste à comparer la valeur objectId avec sa propre chaîne de caractères, faisait planter le serveur Express.js :

var view_task_id_temp=new mongodb.ObjectID("invalid_id_string"); //this crashed

J'ai juste utilisé un simple try catch pour résoudre ce problème.

var mongodb = require('mongodb');
var id_error=false;
try{
    var x=new mongodb.ObjectID("57d9a8b310b45a383a74df93");
    console.log("x="+JSON.stringify(x));
}catch(err){
    console.log("error="+err);
    id_error=true;
}

if(id_error==false){
   // Do stuff here
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X