axios/rack-cors/ реакции-рельсы / герою: внутренняя ошибка сервера 500 при выходе из системы, отсутствие сохранения при обновлении
ОШИБКА MSG:
Error: Request failed with status code 500
Stack trace:
[42]/</t.exports@http://crdwk.herokuapp.com/packs/bundle-ecc8ea14dbe153e50352.js:1:89311
[42]/</t.exports@http://crdwk.herokuapp.com/packs/bundle-ecc8ea14dbe153e50352.js:1:251725
[42]/</t.exports/</d[h]@http://crdwk.herokuapp.com/packs/bundle-ecc8ea14dbe153e50352.js:1:88311
Рубиновая версия: 2.3
Rails версия: 5.1
У меня на стороне сервера отображается, клиентское гидратированное приложение React / Rails (используя gem 'react-rails'
).
Я добавил gem 'rack-cors'
плюс настройка в application.rb
чтобы мои запросы работали (я использую axios
). Тем не менее, выход из системы (запрос DELETE) завершается неудачно, а нажатие на обновление удаляет текущего пользователя. Ни одна проблема не возникает локально / в разработке.
Вот приложение: http://crdwk.herokuapp.com/
1 ответ
Я посмотрел на мои журналы Heroku:
Completed 500 Internal Server Error in 8ms (ActiveRecord: 0.0ms)
NoMethodError (undefined method `reset_token' for nil:NilClass):
app/controllers/application_controller.rb:29:in `sign_out'
app/controllers/api/sessions_controller.rb:3:in `destroy'
Учитывая, что при нажатии на кнопку обновления текущий пользователь не сохраняется, проблема заключается в том, что текущий пользователь как-то не устанавливается.
Однако это не проблема в разработке. С чего бы это?
Просматривая мой проект, единственное отличие, которое я могу найти на бэкэнде, по сравнению с визуализированным на стороне клиента (который я буквально скопировал и вставил код для этого проекта), состоит в том, что эта строка в application_controller.rb
:
skip_before_action :verify_authenticity_token
Однако, если я закомментирую эту строку, когда я пытаюсь зарегистрироваться, я получаю ошибку сервера
Started POST "/api/users" for 127.0.0.1 at 2018-03-05 12:16:57 -0800
Processing by Api::UsersController#create as JSON
Parameters: {"user"=>{"email"=>"", "password"=>"[FILTERED]"}}
Can't verify CSRF token authenticity.
Completed 422 Unprocessable Entity in 1ms (ActiveRecord: 0.0ms)
ActionController::InvalidAuthenticityToken - ActionController::InvalidAuthenticityToken:
Это результат использования gem 'react-rails'
, (Я не получаю эту ошибку для моего другого проекта на стороне клиента.)
Там нет "authenticity_token"
параметр.
Я нахожу эти два ресурса: безопасность Rails и инструкции по Learnetto.
Поэтому я добавляю эти две строки кода из второй артиллерии в мой api.js
:
const csrfToken = document.querySelector("meta[name=csrf-token]").content;
axios.defaults.headers.common["X-CSRF-Token"] = csrfToken;
Теперь мое веб-приложение работает с дополнительным application_controller.rb
строка закомментирована. За исключением того, что я не могу использовать DOM, чтобы получить токен csrf для моей версии React Native, поэтому у меня теперь та же проблема для мобильных устройств...