Я работаю над аутентификацией (используя Knock) для моего rails API, и я не могу перейти по моему маршруту POST, чтобы создать нового пользователя с помощью клиента реакции. Я могу пройти по этому маршруту в Почтальоне, и он успешно создает нового пользователя. Я вижу, что перешел маршрут в почтальоне из терминала, но когда я пробую его на своем клиенте, я не получаю никакого ответа в терминале.
Вещи, которые я пробовал
Гарантированные клиент и сервер работают на разных портах
- У меня есть клиент на локальном хосте: 3000 и мой сервер на локальном хосте: 3001
Убедитесь, что у меня настроен CORS
- Я использую гем 'rack-cors' и настроил инициализатор cors в соответствии с документацией для Rails 5. (Я могу включить этот файл, если вы считаете, что это необходимо)
- Я также включил CORS в своем браузере Chrome
Попробуйте другой маршрут POST
- Я могу успешно войти на клиентской стороне (используя электронную почту / пароль пользователя, который я создал в почтальоне) и сгенерировать токен JWT, используя POST-маршрут к моему API
Удостоверился, что я добираюсь до создателя действия из своего контейнера
- Я добавил отладчик в создатель действий, чтобы убедиться, что я нажимаю на него при отправке формы. Я нажал и получил всю необходимую информацию (имя, фамилия, адрес электронной почты и пароль), чтобы выполнить запрос.
Я думаю, что проблема лежит где-то в моем создателе действий 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)
})
}
}