OData - Index étrange avec MongoDB [Mongoose :Erreur de diffusion]
Question
J'ai quelques documents MongoDB avec ce schéma :
Id: {type: "id", key: true, computed: true, nullable: false},
Name: {type: "string", nullable: false, maxLength: 50}
et ces documents sont exposés au format OData par une petite application Web (j'utilise Express, JayData et Mongoose).Voici quelques-uns de ces documents :
{ "_id" : ObjectId("5343fd656b9c5c084b8f2a70"), "Name" : "Service74"},
{ "_id" : ObjectId("5343fd656b9c5c084b8f2a6f"), "Name" : "Service73"},
{ "_id" : ObjectId("5343fd656b9c5c084b8f2a6e"), "Name" : "Service72"},
...
Si je tape cette adresse http://localhost:8080/marketplace/Services('5343fd656b9c5c084b8f2a70')
qui correspondent à Service74 J'obtiens ce résultat :
...
<d:Id>NTM0M2ZkNjU2YjljNWMwODRiOGYyYTcw</d:Id>
<d:Name>Service74</d:Name>
...
Bien sûr, si j'utilise l'identifiant spécifié dans le résultat, j'obtiens la même page.
Le problème se produit lorsque j'essaie d'utiliser la fonction mangouste findById:
app.post("/addCompare/:id", function(req, res) {
console.log(req.params.id);
Services.findById(req.params.id, function(err, service) {
if(!err) {console.log(service);}
else {console.log(err);}
});
res.send(200);
});
j'ai compris NTM0M2ZkNjU2YjljNWMwODRiOGYyYTcw
et puis cette erreur :
{ message: 'Cast to ObjectId failed for value "NTM0M2ZkNjU2YjljNWMwODRiOGYyYTU5" at path "_id"',
name: 'CastError',
type: 'ObjectId',
value: 'NTM0M2ZkNjU2YjljNWMwODRiOGYyYTU5',
path: '_id' }
Où est-ce que je me trompe ?Dites-moi si d'autres informations me manquent...
Merci.
PS :J'ai trouvé un problème similaire ici Mangouste:La diffusion vers ObjectId a échoué, mais si je change la définition du modèle pour Mongoose (dans laquelle en fait je ne déclare pas l'identifiant) en incluant cette définition :
var serviceSchema = mongoose.Schema({
_id: String,
...
rien ne change...
La solution
Le 5343fd656b9c5c084b8f2a70
est l'identifiant interne de l'entité utilisé côté serveur.Cette valeur est codée en base64 sur OData, c'est pourquoi vous recevez NTM0M2ZkNjU2YjljNWMwODRiOGYyYTcw
dans le champ Identifiant.L'entité peut être facilement récupérée par Id en appelant atob(req.params.id)
sur l'identifiant reçu.