MERN: добавлен объект User в массив другой модели, предотвращены повторные добавления, но теперь он предотвращает и других пользователей. - PullRequest
0 голосов
/ 21 апреля 2020

Мое приложение имеет две модели. Пользователь и Турнир. Пользовательская модель имеет 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.

Я не совсем уверен, с чего начать. Я прочитал некоторые документы / решения для этого сообщения об ошибке, но я не увидел что-то, что выделяется для меня. Возможно, я закодировал себя в угол. Я надеюсь, что все это имеет смысл.

...