Estoy aprendiendo React with Node (Express/Mongoose) y MongoDB y todo parece funcionar como se esperaba ahora, pero tengo este gran problema:
var userSchema = new mongoose.Schema({ login: { type: String, required: true, unique: true }, password: { type: String, required: true } }) app.post('/registerUser', function (req, res) { res.send(req.body) db.on('error', console.error.bind(console, 'connection error:')) // save user using model var user = new UserModel(req.body) user.save() }
Cada vez que PUBLIQUE el inicio de sesión y la contraseña, se guarda solo una vez y luego se termina.
Entonces, por ejemplo, si envío POST tres veces:
login=admin&password=admin
login=admin2&password=admin2
login=admin3&password=admin3
db.users.count()
muestra 1
y solo el primer POST (admin:admin) está en la base de datos. El resto está siendo ignorado. Estoy ejecutando console.logs para ver qué está mal, pero cada POST obtiene un _id diferente, pero de alguna manera no guardo después del primero. Estaba pensando que tal vez hay algo mal con save
y tal vez debería usar algo como update
o create
, pero todos los tutoriales que he visto y la documentación dicen que use save
.
Cuando elimino el campo y la colección está vacía y luego envío POST, se guarda inmediatamente y luego ignora cualquier otro POST (segundo, tercero, etc.).
¿Qué estoy haciendo mal? Quiero tener más de 1 usuario en mi colección :(
[EDITAR]
Parece que mi ID se está creando "sobre la marcha", por lo que MongoDB debería activar la insert
de acuerdo con los documentos: https://docs.mongodb.com/manual/reference/method/db.collection.save/#behavior (también yo' No estoy seguro de lo que está haciendo en este momento, porque tampoco parece una update
:/)
Su problema es que tiene una colección que tiene un índice único que impide la creación, así que simplemente elimine ese índice:
db.users.dropIndex('index name here');
Consejo adicional:
1) db.on('error'
no detectará errores de operación de db.
2) Siempre intente crear un registro y luego responda. En el caso de la experiencia del usuario, se debe informar al usuario si la cuenta se creó correctamente o no.
En resumen, mira este:
db.on('error', console.error.bind(console, 'connection error:')) app.post('/registerUser', (req, res) => { // 1. check if user account exist const query = { login: req.body.login }; UserModel .findOne(query) .exec((error, user) => { if(error) { console.error('ERROR:', error); res.status(500).send({ type: 'system', message: 'Cannot create user record', trace: error }); return; } if(user) { res.status(405).send({ type: 'not-allowed', message: 'User record already exists' }); return; } // 2. create record if user account record does not exist UserModel.create(req.body, (error, user) => { if(error) { console.error('ERROR:', error); res.status(500).send({ type: 'system', message: 'Cannot create user record', trace: error }); return; } res.send(user); }); }); });
OK, olvidé por completo que podía depurarlo usando la CLI de mongo, el problema fue bastante fácil de detectar desde allí. Si esto te sucede, prueba estos pasos:
Inicie la línea de comando/terminal del formulario mongo .
Intente replicar el nodo de acción problemático/controles de mangosta para usted, en mi caso estaba agregando nuevos usuarios:
use users db.users.save( { login: "fromCLI", password: "fromCLI" } ) db.users.save( { login: "fromCLI2", password: "fromCLI2" } )
Lea el mensaje de error, en mi caso fue:
"errmsg" : "E11000 duplicate key error collection: users.users index: username_1 dup key: { : null }"
No tengo índice de nombre de username
. Solía tener. ¡Tuve que dejar la colección y luego mágicamente comenzó a funcionar!