2011-05-09 34 views
8

Estoy trabajando en un módulo de autenticación respaldado por MongoDB para mi aplicación asp.net. La base de datos MongoDB tiene una colección de usuarios donde almaceno información de inicio de sesión: nombre de usuario, correo electrónico y contraseña. Tanto el nombre de usuario y correo electrónico están configurados para ser único:Maneras mejores de manejar las excepciones de MongoDB

users.ensureIndex({email:1}, {unique:1}) 
users.ensureIndex({uname:1}, {unique:1}) 

Ahora, si trato de insertar un registro con uname o correo electrónico existente, me sale una excepción de MongoDB:

Safemode detected an error: E11000 duplicate key error index: 
authdb.users.$email_1 dup key: { : "[email protected]" } 
(response: { "err" : "E11000 duplicate key error index: authdb.users.$email_1 
dup key: { : \"[email protected]\" }", "code" : 11000, "n" : 0, "connectionId" : 9, 
"ok" : 1.0 }) 

tengo que decir la usuario que el nombre de usuario o el correo electrónico que ingresaron ya existe, pero toda la excepción es solo una gota de texto, y para ver qué sucede debo adivinar si "$ email" o "$ uname" están en el mensaje de error . ¿Hay algún tipo de analizador para las excepciones de MongoDB que me ayudaría a detectar para qué es la excepción?

Respuesta

7

He creado una solicitud de función en el rastreador de errores de MongoDB para agregar campos adicionales a la salida de getLastError en los errores de clave duplicados. Por favor vote al https://jira.mongodb.org/browse/SERVER-3069.

Hasta que se implemente, para su caso de uso solo puede verificar si la cadena de error contiene "correo electrónico" o "uname" y recuperar el valor duplicado del documento que acaba de intentar insertar. No es tan elegante como podría ser, pero debería funcionar por ahora.

1

con C# MongoDB duplicado 1.xa controlador se puede detectar como tal

try 
{ 
    collection.Insert(doc); 
} 
catch (MongoWriteConcernException ex) 
{ 
    if (ex.Code == 11000) 
     throw new YourConflictException("User already exists for username and/or email"); 
    else 
     throw ex; 
} 

con C# MongoDB 2.x conductor ver https://stackoverflow.com/a/30309874/516748

Pero si quieres saber exactamente que duplican clave que pueden necesitar para analizar el texto

+1

¿Es una captura de prueba considerada una buena práctica aquí? ¿Deberíamos evitar usar un inserto asíncrono si tenemos un try catch? – AdamMc331

Cuestiones relacionadas