Así que estaba tratando de probar mi servidor de nodos si puede manejar la inserción de datos duplicados en mongodb y aparentemente no puede.
Aquí está el código:
app.post('/register', async (req, res) => { const { email, password, firstName, lastName} = req.body console.log(lastName) console.log(typeof(lastName)) pword = await bcrypt.hash(password, 10) try { const response = user.create({ email: email, password: pword, firstName: firstName, lastName: lastName }) console.log("User created successfully: " + response) } catch (error) { return res.json({ status: 'error'}) } })y aquí está el error:
MongoServerError: E11000 duplicate key error collection: ApartmentDB.UserData index: email_1 dup key: { email: "asdasa" } at C:\Users\Hans\Desktop\MobDev Final Project\node_modules\mongodb\lib\operations\insert.js:51:33 at C:\Users\Hans\Desktop\MobDev Final Project\node_modules\mongodb\lib\cmap\connection_pool.js:272:25 at handleOperationResult (C:\Users\Hans\Desktop\MobDev Final Project\node_modules\mongodb\lib\sdam\server.js:370:9) at MessageStream.messageHandler (C:\Users\Hans\Desktop\MobDev Final Project\node_modules\mongodb\lib\cmap\connection.js:479:9) at MessageStream.emit (node:events:390:28) at processIncomingData (C:\Users\Hans\Desktop\MobDev Final Project\node_modules\mongodb\lib\cmap\message_stream.js:108:16) at MessageStream._write (C:\Users\Hans\Desktop\MobDev Final Project\node_modules\mongodb\lib\cmap\message_stream.js:28:9) at writeOrBuffer (node:internal/streams/writable:389:12) at _write (node:internal/streams/writable:330:10) at MessageStream.Writable.write (node:internal/streams/writable:334:10) { index: 0, code: 11000, keyPattern: { email: 1 }, keyValue: { email: 'asdasa' } } [nodemon] app crashed - waiting for file changes before starting...Vi una publicación similar a la mía que decía que estaba enviando dos respuestas, pero no veo eso en mi caso.
La solución es solo agregar un cheque en su controlador, así:
app.post("/register", async (req, res) => { const { email, password, firstName, lastName } = req.body; console.log(lastName); console.log(typeof lastName); pword = await bcrypt.hash(password, 10); const existingUser = user.findOne({ email }); if (existingUser) return res.send("User already exists"); try { const response = await user.create({ email: email, password: pword, firstName: firstName, lastName: lastName, }); console.log("User created successfully: " + response); } catch (error) { return res.json({ status: "error" }); } }); También tenga en cuenta que una vez que agrega al usuario, solo está console.log() ing los datos y no envía ninguna respuesta, lo que solo terminará generando un tiempo de espera en su lado del cliente.
Creo que no has usado await user.create .
antes de completar la operación de inserción de DB, está devolviendo una respuesta y luego DB arroja un error.
app.post("/register", async (req, res) => { const { email, password, firstName, lastName } = req.body; console.log(lastName); console.log(typeof lastName); pword = await bcrypt.hash(password, 10); try { const response = await user.create({ email: email, password: pword, firstName: firstName, lastName: lastName, }); console.log("User created successfully: " + response); } catch (error) { if (error.status === "E11000") { // it could be .status, .code etc.. not sure return res.json({ status: "error", msg: "User already exist." }); } return res.json({ status: "error" }); } });