Я могу использовать мой API для каждого запроса, но мой запрос POST для создания нового пользователя - PullRequest
0 голосов
/ 29 мая 2019

Я работаю над аутентификацией (используя Knock) для моего rails API, и я не могу перейти по моему маршруту POST, чтобы создать нового пользователя с помощью клиента реакции. Я могу пройти по этому маршруту в Почтальоне, и он успешно создает нового пользователя. Я вижу, что перешел маршрут в почтальоне из терминала, но когда я пробую его на своем клиенте, я не получаю никакого ответа в терминале.

Вещи, которые я пробовал

  1. Гарантированные клиент и сервер работают на разных портах

    • У меня есть клиент на локальном хосте: 3000 и мой сервер на локальном хосте: 3001
  2. Убедитесь, что у меня настроен CORS

    • Я использую гем 'rack-cors' и настроил инициализатор cors в соответствии с документацией для Rails 5. (Я могу включить этот файл, если вы считаете, что это необходимо)
    • Я также включил CORS в своем браузере Chrome
  3. Попробуйте другой маршрут POST

    • Я могу успешно войти на клиентской стороне (используя электронную почту / пароль пользователя, который я создал в почтальоне) и сгенерировать токен JWT, используя POST-маршрут к моему API
  4. Удостоверился, что я добираюсь до создателя действия из своего контейнера

    • Я добавил отладчик в создатель действий, чтобы убедиться, что я нажимаю на него при отправке формы. Я нажал и получил всю необходимую информацию (имя, фамилия, адрес электронной почты и пароль), чтобы выполнить запрос.

Я думаю, что проблема лежит где-то в моем создателе действий userSignUpFetch или в моем контроллере пользователя.

Создатель действий, который обрабатывает процесс отправки нового пользовательского объекта на рельсы

export const userSignUpFetch = (user) => {
  const newUser = user
  return dispatch => {
    return fetch(`http://localhost:3001/api/users`, {
      method: "POST",
      headers: {
        Accept:"application/json",
        "Content-Type":"application/json"
      },
      body: JSON.stringify({user: user})
    })
      .then(response => response.json())
      .then(jresp => {
        dispatch(loginUserFetch({
          first_name: newUser.first_name,
          last_name: newUser.last_name,
          email: newUser.email,
          password: newUser.password})
        );
      })
      .catch((errors) => {
        dispatch(authFailure(errors))
      })
  };
}

Мои текущие маршруты для аутентификации в Rails

api_users      GET      /api/users(.:format)   api/users#index
               POST     /api/users(.:format)  api/users#create
api_user       GET      /api/users/:id(.:format) api/users#show
               PATCH    /api/users/:id(.:format) api/users#update
               PUT      /api/users/:id(.:format) api/users#update
               DELETE   /api/users/:id(.:format) api/users#destroy
api_user_token POST     /api/user_token(.:format) api/user_token#create
api_find_user  POST     /api/find_user(.:format) api/users#find

My Rails User Controller

class Api::UsersController < ApplicationController
  before_action :set_user, only: [:show, :update]

  def index
    @users = User.all
    render json: @users
  end

  def create
    @user = User.create(user_params)
    if @user.valid? && @user.save
      render json: @user
    else
      render json: @user.errors, status: 400
    end
  end

  def show
    render json: @user
  end

  def update
    if @user.update(user_params)
      render json: @user
    else
      render json: @user.errors, status: 400
    end
  end

  def destroy
    @user.destroy
  end

  def find
   @user = User.find_by(email: params[:user][:email])
   if @user
     render json: @user
   else
     @errors = @user.errors.full_messages
     render json: @errors
   end
  end

  private

  def set_user
    @user = User.find_by(id: params[:id])
  end

  def user_params
    params.require(:user).permit(:first_name, :last_name, :email, :password)
  end

end

Я ожидаю увидеть что-то вроде

Запущен POST "/ api / users" для :: 1 в 2019-05-28 17:56:41 -0500

в моем терминале, но когда я нажимаю на этого создателя действия, я не получаю никакого ответа от моего терминала, работающего на сервере. Мне интересно, есть ли у кого-нибудь предложения о том, что искать. Спасибо.

Обновление

Я верю, что это что-то с моей отправкой.

Это ниже работает, до jresp.loginUserFetch

export const userSignUpFetch = user => {
  //Fetch request info
  const newUser = JSON.stringify({user: user})
  const userAuth = JSON.stringify({user})

  const options = {
    method: 'post',
    headers: {
      'Content-type': 'application/json'
    },
    body: newUser
  }
  const fetchURL = `${API_URL}/users`

  return fetch(fetchURL, options)
    .then(resp => resp.json())
    .then(jresp => jresp.loginUserFetch({
        first_name: userAuth.first_name,
        last_name: userAuth.last_name,
        email: userAuth.email,
        password: userAuth.password}))
    .catch( err => {
      console.log('Request Failed:', err)
    })
}

Обновление 2 - получил работу

Я импортировал выборку из перекрестной выборки, а также немного ее очистил, но теперь она работает так, как требуется, и это заставляет меня поверить, что мне нужна перекрестная выборка в файле.

export const userSignUpFetch = user => {
  //Fetch request info
  const newUser = JSON.stringify({user: user})

  const options = {
    method: 'post',
    headers: {
      'Content-type': 'application/json'
    },
    body: newUser
  }
  const fetchURL = `${API_URL}/users`

  return dispatch => {
    return fetch(fetchURL, options)
      .then(resp => resp.json())
      .then(jresp => { dispatch(loginUserFetch({
        first_name: user.first_name,
        last_name: user.last_name,
        email: user.email,
        password: user.password})
        )
      })
      .catch( err => {
        console.log('Request Failed:', err)
      })
    }
  }

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...