React调用Rails后端注册接口无返回,.then未触发问题排查
兄弟,我之前也踩过一模一样的坑!数据库明明已经把用户存进去了,可前端的.then回调就是纹丝不动,debugger也没触发,简直让人摸不着头脑。结合React+Rails的技术栈,大概率是这几个问题在搞鬼:
后端没返回正确的JSON响应
你得先检查Rails的create动作最后有没有明确返回JSON!很多人写完@user.save就完事了,但Rails默认会去寻找对应的视图模板(比如users/create.json.jbuilder),如果找不到的话,要么返回500错误,要么返回空白内容。前端的请求(不管是用fetch还是axios)一直在等合法的响应,自然不会触发.then回调。哪怕数据库保存成功了,没有正确的响应信号,前端根本收不到通知。正确的写法应该是这样的:
def create @user = User.new(user_params) if @user.save # 明确返回创建成功的JSON和201状态码 render json: @user, status: :created else # 失败时返回错误信息和422状态码 render json: @user.errors, status: :unprocessable_entity end end跨域(CORS)配置没到位
如果你的React跑在localhost:3000,Rails跑在localhost:3001这种不同端口,浏览器的跨域安全策略会直接拦截响应!虽然后端已经把用户存进数据库了,但浏览器不让前端拿到这个响应,.then自然不会执行。解决方法是在Rails里安装
rack-corsgem,然后在config/initializers/cors.rb里配置允许前端域名访问:Rails.application.config.middleware.insert_before 0, Rack::Cors do allow do origins 'http://localhost:3000' # 你的React应用地址 resource '*', headers: :any, methods: [:get, :post, :put, :patch, :delete, :options, :head] end end前端请求的响应处理有问题
比如用fetch的时候,你得手动解析JSON,而且如果后端返回的内容不是合法JSON,会抛出错误。如果你的代码只写了.then没写.catch,就看不到错误信息,误以为回调没执行。举个例子:fetch('/api/users', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(userData) }) .then(res => { // 先检查响应状态是否正常 if (!res.ok) throw new Error('请求出错'); return res.json(); // 必须解析JSON才能拿到数据 }) .then(data => { // 这里才是处理成功的逻辑 debugger; }) .catch(err => { // 别忘了加catch,不然错误会被吞掉 console.error(err); });如果用axios的话,要确保配置了正确的
Content-Type,不然可能也会出现响应解析失败的情况。后端不小心做了重定向
有没有可能你的create动作里加了redirect_to @user这种代码?这会让Rails返回302重定向,前端跟着重定向后拿到的是用户页面的HTML,而不是预期的JSON。这时候前端解析JSON就会失败,要么进入.catch,要么直接没反应。
先从这几个方向排查,应该能找到问题!
内容的提问来源于stack exchange,提问作者Andrew Schubert

