#node.js #express
Вопрос:
Я работаю в проекте MERN. я вставляю данные формы в свою базу данных. Я успешно вставил все данные формы.
Но я хочу проверить, что если какой-либо пользователь собирается зарегистрировать дубликат электронной почты, он должен выдать пользователю ошибку
Ошибка, которую я получаю в терминале vscode
Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client at ServerResponse.setHeader (_http_outgoing.js:561:11) at ServerResponse.header (C:UserskumarDesktopkridhatutorservernode_modulesexpresslibresponse.js:771:10) at ServerResponse.send (C:UserskumarDesktopkridhatutorservernode_modulesexpresslibresponse.js:170:12) at ServerResponse.json (C:UserskumarDesktopkridhatutorservernode_modulesexpresslibresponse.js:267:15) at C:UserskumarDesktopkridhatutorserverrouterAuth.js:105:37 at processTicksAndRejections (internal/process/task_queues.js:95:5) { code: 'ERR_HTTP_HEADERS_SENT'
И в моем браузере я получаю —«Электронная почта уже существует»—
Для этого я попробовал это
const storage = multer.diskStorage({ destination: function (req, file, cb) { let email = req.body.email; let path = `C:/Users/kumar/Desktop/kridhatutor/server/images/${email}`; fs.mkdirsSync(path); cb(null, path); // cb(null, 'images'); }, filename: function (req, file, cb) { cb(null, file.originalname); } }); const fileFilter = (req, file, cb) =gt; { const allowedFileTypes = ['image/jpeg', 'image/jpg', 'image/png']; if (allowedFileTypes.includes(file.mimetype)) { cb(null, true); } else { cb(null, false); } } let upload = multer({ storage, fileFilter }); router.post('/teacherregister', upload.fields([{ name: "profilephoto", maxCount: 1 }, { name: "identityphoto", maxCount: 1 }, { name: "tenthphoto", maxCount: 1 }, { name: "twelvephoto", maxCount: 1 }, { name: "latestphoto", maxCount: 1 } ]), (req, res) =gt; { const names = req.body.names const phone = req.body.phone const email = req.body.email const city = req.body.city const address = req.body.address const comfortable = req.body.comfortable const classesyoutake = req.body.classesyoutake const subjectsyoutake = req.body.subjectsyoutake const teachingexprienceinyears = req.body.teachingexprienceinyears const exprienceteaching = req.body.exprienceteaching const profilephoto = req.files['profilephoto'][0] const identityphoto = req.files['identityphoto'][0] const tenthphoto = req.files['tenthphoto'][0] const twelvephoto = req.files['twelvephoto'][0] const latestphoto = req.files['latestphoto'][0] try { const userEx = TECAHER.findOne({ email: email }) if (userEx) { res.status(400).json({ error: "Email already exit" }) // alert("email already exit") } const newUserData = { names, phone, email, city, address, comfortable, classesyoutake, subjectsyoutake, teachingexprienceinyears, exprienceteaching, profilephoto, identityphoto, tenthphoto, twelvephoto, latestphoto } const newUser = new TECAHER(newUserData); newUser.save() .then(() =gt; res.json('User Added')) .catch((err) =gt; { console.log(err); }); } catch (err) { console.log(err) } }) //STUDENT--PARENT register router.post("/register", async (req, res) =gt; { const { identity, names, phone, email, city, address, subject, classes, message } = req.body // if (!identity || !names || !phone || !email || !city || !address || !subject || !classes || !message) { // return res.status(422).json({ error: "Please mark all the field" }) // } try { const userExit = await User.findOne({ email: email }) if (userExit) { res.status(400).json({ error: "Email already exit" }) // alert("email already exit") } // else if (password != cpassword) { // return res.status(422).json({ error: "password and confirm password don not match" }) // } const user = new User({ identity, names, phone, email, city, address, subject, classes, message }) await user.save() res.status(201).json({ message: "user registered successfulluy" }) } catch (err) { console.log(err) } })
Как проверить это условие?
Спасибо
Ответ №1:
После отправки сообщения об ошибке вы должны вернуться из своей функции:
if (userEx) { res.status(400).json({ error: "Email already exists" }); return; }
В противном случае будет выполнена остальная часть функции, что приведет к отправке другого сообщения («Добавлен пользователь»). Но вы можете использовать res.json
не более одного раза на запрос, в противном случае вы получите наблюдаемую ошибку.
Комментарии:
1. Теперь я понимаю это
FormData { } Object { error: "Email already exit" }
2. Ставьте
return
перед каждым заявлением res