2012-02-26 18 views
14

Actualmente estoy tratando de hacer un formulario de registro usando mongoDB y nodeJS - He creado una nueva base de datos y colección - Quiero almacenar: nombre de usuario, contraseña, correo electrónico e inserción_time en mi base de datosInsertar datos en MongoDB - sin errores, sin insertar

Agregué índices únicos al nombre de usuario/correo electrónico y verifiqué si funciona, y no puedo agregar una entrada duplicada usando la consola de mongo o rockmongo (php mongodb manager), así que funciona bien.

Sin embargo, cuando se ejecuta el fragmento de código que se supone que registra una nueva cuenta y realiza una inserción con los datos que ya están en la base de datos, devuelve un objeto que contiene todos los datos que se suponía que se agregarían con una identificación nueva y única El punto es que debería devolver un error que diga que las entradas no se pueden duplicar y la inserción falló, en cambio devuelve los datos y le da una nueva identificación. Los datos que ya residen en la base de datos permanecen intactos, incluso la ID permanece igual, no se reescribe con la nueva que devuelve la inserción del script.

Entonces, la pregunta es ... ¿qué estoy haciendo mal? ¿O tal vez todo está bien y la inserción de la base de datos debería devolver los datos incluso si falla? ...

Incluso intenté definir los índices antes de ejecutar los índices. Intenté insertar los datos usando las funciones por defecto de mongoDB y las funciones mongoJS - el resultado es el mismo en ambos casos.

El código que estoy tratando de ejecutar (por 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); 
     } 
    }); 
} 

Para ambos casos - la inserción de nuevos datos y la inserción de datos duplicados que no modifica la base de datos de ninguna manera - ERROR es nulo y se guarda es solo una copia de los datos que se supone deben ser insertados. ¿Hay alguna manera de verificar si la inserción se realizó o no, o tengo que verificar si los datos ya existen en la base de datos o no manualmente antes/después de hacer una inserción?

Respuesta

1

Esto parece ser básicamente el mismo problema que MongoDB unique index does not work - pero con la API de JavaScript en lugar de Java. Es decir, guardar sin especificar el indicador "seguro" o verificar explícitamente el último valor de error no es seguro --- el ID se genera por el lado del cliente y el comando enviado, pero aún puede fallar (por ejemplo, debido a una violación de índice único). Necesita obtener explícitamente el último estado de error.

http://www.mongodb.org/display/DOCS/dbshell+Reference#dbshellReference-ErrorChecking sugiere db.getLastError() usando el shell de comandos, y supongo que la API del nodo es idéntica donde posiblemente puedan hacerlo.

+0

consola no devuelve ningún valor cuando se utiliza db.getLastError() - supongo que mongo no guarda ningún error - pero como he dicho - que no me deja a insertar una entrada duplicada - Yo "puedo" hacer eso solo usando nodeJS. – biphobe

Cuestiones relacionadas