Es una ruta de registro simple para almacenar credenciales en una base de datos mongoDB, pero extraño algo porque los else if 2 no funcionarán correctamente. Sospecho que es mi find() .
El primero else if me devuelve en Postman "error": "E11000 duplicate key error collection: vinted.users index: email_1 dup key: { email: \"jean@dpont.com\" }" y el segundo me da "email already exists".
Gracias de antemano por tu ayuda
const express = require("express"); const router = express.Router(); const SHA256 = require("crypto-js/sha256"); const encBase64 = require("crypto-js/enc-base64"); const uid2 = require("uid2"); const User = require("../models/User"); router.post("/user/signup", async (req, res) => { try { const email = req.fields.email; const username = req.fields.username; const phone = req.fields.phone; const password = req.fields.password; const token = uid2(64); const salt = uid2(16); const hash = SHA256(password + salt).toString(encBase64); const emailSearch = await User.find({ email: email }); if (!emailSearch || username !== null) { const newUser = new User({ email: email, account: { username: username, phone: phone, }, password: password, token: token, hash: hash, salt: salt, }); await newUser.save(); res.status(200).json({ _id: newUser._id, token: newUser.token, account: newUser.account, }); } //problem under else if (emailSearch) { res.status(404).json({ message: "email already exists" }); } else if (username === null) { res.status(404).json({ message: "please type a username" }); } } catch (error) { res.status(404).json({ error: error.message, }); } });Parece que el problema es que si el nombre de usuario en el cuerpo de la solicitud no es null , intentará crear un nuevo usuario con ese nombre de usuario independientemente de si existe un usuario con el mismo correo electrónico, if (!emailSearch || username !== null) .
En general, es una buena práctica hacer la mayor cantidad posible de validación de entrada antes de comenzar a buscar registros o crear nuevos, ya que podrá evitar más errores de Mongo y acciones de la base de datos si puede detener las acciones no válidas antes de que se intenten. Entonces, en este caso, verifique que el nombre de usuario sea válido antes de buscar Usuarios existentes.
Para resolver este problema, movería ese último else-if antes de verificar si existe un usuario con el mismo correo electrónico. De esa manera, una vez que determine si el nombre de usuario es válido, lo único que debe considerar son los usuarios existentes antes de crear uno nuevo. Algo como esto:
if (username === null) { res.status(400).send({ message: "Error: Please provide a 'username'." }); } const existingUserWithEmail = await User.find({ email: email }); if (!existingUserWithEmail) { // Create the new User } else { res.status(400).send({ message: "Error: An account already exists with this email." }); }