Insertion de données dans MongoDB – pas d’erreur, pas d’insertion

J’essaie actuellement de créer un formulaire de registre en utilisant mongoDB et nodeJS – j’ai créé une nouvelle firebase database et une nouvelle collection – je souhaite stocker: nom d’utilisateur, mot de passe, email et insert_time dans ma firebase database.

J’ai ajouté des index uniques à nom d’utilisateur / email et vérifié si cela fonctionne – et je ne peux pas append une entrée dupliquée à l’aide de la console de mongo ou de rockmongo (gestionnaire php mongodb) – donc cela fonctionne bien.

Toutefois, lorsque la partie de code censée enregistrer un nouveau compte est en cours d’exécution et effectue une insertion avec les données déjà présentes dans la firebase database, elle renvoie un object contenant toutes les données censées être ajoutées avec un nouveau compte. identifiant unique. En réalité, il devrait renvoyer une erreur indiquant que les entrées ne peuvent pas être dupliquées et que l’insertion a échoué. Au lieu de cela, il renvoie les données et lui donne un nouvel identifiant. Les données qui résident déjà dans la firebase database restnt inchangées – même l’identifiant rest identique – elles ne sont pas réécrites avec le nouvel identifiant renvoyé par l’insertion du script.

Donc, la question est … qu’est-ce que je fais mal? Ou peut-être que tout va bien et que l’insertion de la firebase database devrait renvoyer des données même si elles échouent? …

J’ai même essayé de définir des index avant d’exécuter des index. J’ai essayé d’insérer les données en utilisant les fonctions par défaut de mongoDB et de mongoJS – le résultat est le même dans les deux cas.

Le code que j’essaye d’exécuter (pour mongoJS ):

var dbconn = require("mongojs").connect('127.0.0.1:27017/db', ['users']); var register = function(everyone, params, callback) { // TODO: validation dbconn.users.ensureIndex({username:1},{unique:true}); dbconn.users.ensureIndex({email:1},{unique:true}); dbconn.users.save( { username: params.username, password: params.password, email: params.email, insert_time: Date.now() }, function(error, saved) { if(error || !saved) { callback(false); } else { console.log(error); console.log(saved); callback(true); } }); } 

Dans les deux cas – insertion de nouvelles données et insertion de données dupliquées qui ne modifient en rien la firebase database – ERROR est null et SAVED est simplement une copie des données qui sont supposées être insérées. Existe-t-il un moyen de vérifier si une insertion a été faite ou non – ou dois-je vérifier si les données existent déjà dans la firebase database ou non manuellement avant / après avoir effectué une insertion?

Mongo fonctionne de cette façon. Vous devez indiquer que vous souhaitez récupérer les erreurs en utilisant l’option safe lorsque vous exécutez la commande save (comme par défaut, il utilise la méthode “fire and forget”).

https://docs.mongodb.com/manual/reference/command/getLastError/

Cela semble être fondamentalement le même problème que l’ index unique MongoDB ne fonctionne pas – mais avec l’API JavaScript plutôt que Java. C’est-à-dire que l’enregistrement sans spécifier l’indicateur “safe” ou vérifier explicitement la dernière valeur d’erreur est non sécurisé — l’ID est généré côté client et la commande est envoyée, mais elle peut toujours échouer (en raison d’une violation d’index unique, par exemple). Vous devez explicitement obtenir le dernier statut d’erreur.

http://www.mongodb.org/display/DOCS/dbshell+Reference#dbshellReference-ErrorChecking suggère à db.getLastError() à l’aide du shell de commande, et je suppose que l’API de nœud est identique à l’endroit où ils peuvent le faire.