Мое приложение имеет две модели. Пользователь и Турнир. Пользовательская модель имеет username
и _id
(mongodb). В турнирной модели есть participants
, который является массивом.
Я пытаюсь сделать так, чтобы каждый пользователь, зарегистрировавшийся на турнир, мог сделать это только один раз.
Я написал Express маршрут к POST к массиву participants
турнира:
router.post('/:id', (req, res) => {
Tournament.findById(req.params.id)
.then(tournament => {
const userSignedUp = (participantsArray, user) => {
return participantsArray.some(arr => arr.user === user);
};
// Check if User already signed up
if (userSignedUp(tournament.participants, req.body.user._id) !== true && userSignedUp(tournament.participants, req.body.user.id) !== true) {
tournament.participants.push(req.body.user);
} else {
return res.status(400).json({ msg: "This user is already signed up" });
}
return tournament.save();
})
.then(savedTournament => res.json(savedTournament))
.catch(err => res.json(err));
});
После некоторых экспериментов я научился писать это утверждение if()
, чтобы пользователь не мог зарегистрироваться несколько раз:
Затем я приложил все усилия, чтобы подключить Redux для отправки того, что я хочу, на этот маршрут через axios
РЕДУКТОР:
const initialState = {
participant: null
};
export default function(state = initialState, action) {
switch(action.type) {
case USER_JOINS_TOURNAMENT:
return {
...state,
participant: action.payload
}
case TOURNAMENT_SIGN_UP_FAIL:
return {
...state,
participant: null
}
default:
return state;
};
};
ДЕЙСТВИЕ:
export const addParticipant = (_id, user) => dispatch => {
const config = {
headers: {
"Content-Type": "application/json"
}
};
const body = JSON.stringify({ user });
axios.post(`/tournaments/${_id}`, body, config)
.then(() => dispatch({
type: USER_JOINS_TOURNAMENT,
payload: user
}))
.catch(err => {
dispatch(returnErrors(err.response.data, err.response.status));
dispatch({
type: TOURNAMENT_SIGN_UP_FAIL
});
});
};
Я не был уверен, нужен ли мне config // body, но без этого он не сработал.
Имея это, пользователь может войти в систему, создать турнир, а затем Зарегистрируйтесь один раз. Если он зарегистрируется снова, он заблокирует его сообщением об ошибке.
Однако, когда я регистрируюсь на другом Пользователе, он выдает то же сообщение об ошибке (даже если массив tournament.participants
не имеет этого ID пользователя в нем)
И в моем терминале я получаю эту ошибку:
(node:9734) UnhandledPromiseRejectionWarning: Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
[0] at ServerResponse.setHeader (_http_outgoing.js:526:11)
[0] at ServerResponse.header (/home/dustin/Desktop/Smash-Hosting/node_modules/express/lib/response.js:771:10)
[0] at ServerResponse.send (/home/dustin/Desktop/Smash-Hosting/node_modules/express/lib/response.js:170:12)
[0] at ServerResponse.json (/home/dustin/Desktop/Smash-Hosting/node_modules/express/lib/response.js:267:15)
[0] at /home/dustin/Desktop/Smash-Hosting/routes/api/tournaments.js:109:21
[0] at processTicksAndRejections (internal/process/task_queues.js:97:5)
[0] (node:9734) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 1)
[0] (node:9734) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
Я не совсем уверен, с чего начать. Я прочитал некоторые документы / решения для этого сообщения об ошибке, но я не увидел что-то, что выделяется для меня. Возможно, я закодировал себя в угол. Я надеюсь, что все это имеет смысл.