反应应用程序中来自axios POST的空响应,rails服务器显示201状态

Posted

技术标签:

【中文标题】反应应用程序中来自axios POST的空响应,rails服务器显示201状态【英文标题】:empty response from axios POST in react app, rails server shows 201 status 【发布时间】:2019-01-11 14:31:38 【问题描述】:

我有一个连接到 Rails API 的反应前端,使用 Knock 和 JWT 对用户进行身份验证。我在 post 请求中发送电子邮件和密码,然后将令牌(来自响应数据)保存在 localStorage 中以将其传递给其他功能。

在提交登录表单时,rails 控制台显示状态 201,但我的帖子请求中的响应为空(不是错误)

这是发帖请求:

login () 
   const $ = window.$;
   const email = $("#email").val()
   const password = $("#password").val()
   const request = "auth": "email": email, "password": password
   console.log(request)

   axios.post('api/v1/user_token', request)
     .then(response => 
     console.log(response)
     localStorage.setItem("jwt", response.jwt)
   )
    .catch(error => console.log(error))

在我的 Rails 控制台中,我看到了

Completed 201 Created in 112ms (Views: 0.2ms | ActiveRecord: 0.5ms)

并且在 javascript 控制台中没有错误。

我尝试删除 Knock,并从头开始重写基本身份验证,同样的问题,即使服务器生成一个令牌,我也无法在对 post 请求的响应中取回它。如果我将令牌硬编码到获取请求中,它会起作用并且我会取回数据。

这是从 Knock install 创建的 user_tokens 控制器

module Api::V1
  class UserTokenController < Knock::AuthTokenController
  end
end

还有我的(非常小的)用户模型

class User < ApplicationRecord
  has_secure_password
  has_many :events 
end

(byebug) request.content_type
"application/json"
(byebug) request.format
#<Mime::Type:0x00007fef56c28650 @synonyms=["application/xhtml+xml"], 
@symbol=:html, @string="text/html", @hash=-2331784109630414172>
(byebug) request.accept
"application/json, text/plain, */*"

.rvm/gems/ruby-2.5.1/gems/rack-2.0.5/lib/rack/sendfile.rb
134:         when '', nil
135:         else
136:           env[RACK_ERRORS].puts "Unknown x-sendfile variation: '# 
.type'.\n"
137:         end
138:       end
139:       [status, headers, body]
140:     end
141: 
142:     private
143:     def variation(env)
(byebug) status
201
(byebug) headers
"X-Frame-Options"=>"SAMEORIGIN", "X-XSS-Protection"=>"1; mode=block", 
"X-Content-Type-Options"=>"nosniff", "Content- 
Type"=>"application/json; charset=utf-8", 
"ETag"=>"W/\"6d43c14099bd994119752b6ad84913c1\"", "Cache- 
Control"=>"max-age=0, private, must-revalidate", "X-Request- 
Id"=>"e1004d69-e7ef-4145-8b62-bb86e2325ea8", "X- 
Runtime"=>"1585.123732"

我是新手,所以我可能遗漏了一些非常明显的东西。

【问题讨论】:

请提供您的控制器源和完整的日志输出...这就像看着水晶球:) 尝试发送 Accept 和 Content-Type 标头,并请提供请求的完整 rails 日志。 【参考方案1】:

除了为 React 前端使用 package.json 中设置的代理:

"proxy": 
  "/api/v1": 
  "target": "http://localhost:3001"
   
,

我创建了一个自定义的 axios 组件:

import axios from 'axios'

const instance = axios.create(
  baseURL: 'http://localhost:3001/'
)

export default instance

并禁用了 Chrome 安全工具并能够检索有效令牌。这解决了我在开发环境中遇到的问题,并允许我在每次成功请求后使用令牌更新 localStorage。

【讨论】:

以上是关于反应应用程序中来自axios POST的空响应,rails服务器显示201状态的主要内容,如果未能解决你的问题,请参考以下文章

如何在反应中设置来自axios的响应状态

无法捕获并记录来自 axios 请求的错误响应

如何将 map() 与来自 axios 响应的数据一起使用?

如何在反应中使用axios(post)

如何在反应中正确获得axios响应?

Axios.post 在反应 js 中不起作用