У меня есть следующий код для регистрации пользователя. Где я впервые проверяю пользовательский ввод. Во-вторых, я проверяю, существует ли пользователь, если да, он должен вернуться с ответом 400. Если нет, перейдите к шагу 3 и добавьте нового пользователя. Наконец на шаге 4 верните вновь созданную запись. Логично, что он работает и правильно добавляет данные в базу данных, однако всегда отвечает 'User already exists'
на почтальоне (из шага 2), даже если это новый пользователь, который правильно добавил пользователя в базу данных. Это заставляет меня думать, что третий шаг выполняется до того, как может быть отправлен ответ на шаге 2, что означает, что я не правильно связал обещание. Кроме того, новый пользователь никогда не отправляется обратно в качестве ответа, что я думаю, потому что я не использовал Promise.then () вместе с user.save () правильно. Я также получаю следующую ошибку (опубликованную после кода), которая, как я понимаю, означает, что я пытаюсь отправить второй ответ после того, как первый уже был отправлен. Я могу решить эту проблему с помощью async и await, но хочу научиться делать это таким образом. Спасибо, любая помощь приветствуется.
const { User, validateUser } = require('../models/userModel');
const mongoose = require('mongoose');
const express = require('express');
const router = express.Router();
router.post('/', (req, res) => {
return Promise.resolve()
.then(() => {
//Step 1: validae the user input and if there is an error, send 400 res and error message
console.log('My user post body req::', req.body);
const { error } = validateUser(req.body); //this is using Joi.validate() which has a error property if errors are found
if (error) {
return res.status(400).send(error.details[0].message);
}
})
.then(() => {
//step 2: check if user already exists, if yes send res 400
let user = User.findOne({ email: req.body.email });
if (user) {
return res.status(400).send('User already exists');
}
})
.then(() => {
//Step 3: enter new user into the database
user = new User({
name: req.body.name,
email: req.body.email,
password: req.body.password
});
return user.save();
})
.then((result) => {
//step 4: return the newly added user
return res.status(200).send(result);
})
.catch((error) => {
console.log('Error Adding new User', error);
});
});
module.exports = router;
Я получаю следующее сообщение об ошибке из улова. Хотя я и возвращаюсь с каждым ответом
Error Adding new User Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
at ServerResponse.setHeader (_http_outgoing.js:494:11)
at ServerResponse.header (/home/ssaquif/WebDevProjects/movie-reviews-backend/node_modules/express/lib/response.js:771:10)
at ServerResponse.send (/home/ssaquif/WebDevProjects/movie-reviews-backend/node_modules/express/lib/response.js:170:12)
at ServerResponse.json (/home/ssaquif/WebDevProjects/movie-reviews-backend/node_modules/express/lib/response.js:267:15)
at ServerResponse.send (/home/ssaquif/WebDevProjects/movie-reviews-backend/node_modules/express/lib/response.js:158:21)
at /home/ssaquif/WebDevProjects/movie-reviews-backend/routes/users.js:35:27
at processTicksAndRejections (internal/process/task_queues.js:93:5) {
code: 'ERR_HTTP_HEADERS_SENT'