Проверка ввода с помощью Joi - Express и использование его в React - PullRequest
0 голосов
/ 23 октября 2019

Я пытаюсь проверить форму, используя Redux Form, Thunk, а затем Joi на сервере. Что я хотел бы сделать, это когда пользователь отправляет форму, я хочу отправить свое действие, которое вызывает мой API, и затем, если промежуточное ПО Joi обнаружит проблему с формой, соответственно отреагирует на внешний интерфейс, основываясь на том, чтоошибка есть.

Проблема, с которой я столкнулся, заключается в том, что я не знаю, как получить доступ к json, который следует из кода состояния ошибки, отправленного Джоем.

Вот мое диспетчерское действие на внешнем интерфейсе:

export const signUp = (
  newUser: User
): ThunkAction<void, AppState, null, Action<string>> => async dispatch => {
  try {
    const res = await axios.post("http://localhost:2000/users/signup", newUser);
  } catch (error) {
     console.log("THE ERROR", error)
  }
};

А затем на бэкэнде это мое промежуточное программное обеспечение для joi:

validateBody: (schema) => {
        return (req, res, next) => {
            const result = Joi.validate(req.body, schema);
            if (result.error)  {
                return res.status(400).json({ error: "this is your error" })
            }

            // validated values are in req.value.body if it's there
            if (!req.value) {
                req.value = {};
            }
            req.value['body'] = result.value;
            // the next allows the middleware to pass through
            next();
        }

    },

Если я запускаю это спроблема в форме, я получаю

THE ERROR Error: Request failed with status code 400
    at createError (createError.js:17)
    at settle (settle.js:19)
    at XMLHttpRequest.handleLoad (xhr.js:60)

Но я не могу найти, как получить доступ к json («это ваша ошибка») в блоке catch. Любая помощь могла бы быть полезна. Большое спасибо.

1 Ответ

0 голосов
/ 23 октября 2019

Ошибка Axios находится внутри error.response.

Вы можете получить доступ к ошибке следующим образом:

  try {
    const res = await axios.post("http://localhost:2000/users/signup", newUser);
  } catch (error) {
    if (error.response) {
      /*The request was made and the server responded with a
        status code that falls out of the range of 2xx  */
      console.log(error.response.data);
      console.log(error.response.status);
      console.log(error.response.headers);
    } else if (error.request) {
      /* The request was made but no response was received, `error.request`
       * is an instance of XMLHttpRequest in the browser and an instance
       * of http.ClientRequest in Node.js */
      console.log(error.request);
    } else {
      // Something happened in setting up the request and triggered an Error
      console.log("Error", error.message);
    }
  }

...