【问题标题】:SystemStackError (stack level too deep) - rendering JSONSystemStackError(堆栈级别太深) - 呈现 JSON
【发布时间】:2020-12-03 09:48:24
【问题描述】:

使用 Rails API 构建。提交 API 请求登录时收到错误 SystemStackError (stack level too deep)

错误在于在这一行上渲染 JSON render json: {user: @user, token: token}.as_json, serializer: nil, :status => :ok

尝试过的解决方案:

SystemStackError (stack level too deep)

Ruby 2.4 and Rails 4 stack level too deep (SystemStackError)

https://github.com/rmosolgo/graphql-ruby/issues/2214

用户控制器:

class UsersController < ApplicationController
  #auth_login only action to be authorized before an action
  before_action :authenticate_request, only: [:auto_login, :edit]

  def login
    @user = User.find_by(email: params[:email])

    if @user && @user.authenticate(params[:password])
      token = encode_token({email: @user.email})
      render json: {user: @user, token: token}.as_json, serializer: nil, :status => :ok
    else
      render json: {error: "Invalid email or password"}, :status => :unauthorized
    end
  end

  private

  def default_serializer_options
    {
    serializer: nil
    }
  end
end

这个错误很烦人,因为它不一致!有时它可以毫无问题地构建,有时则不会。不知道该去哪里,因为我看不到代码递归的任何地方。

更新:应用程序控制器encode_token

class ApplicationController < ActionController::API
    before_action :authenticate_request

    def encode_token(payload)
        JWT.encode(payload, 's3cr3t')
    end

    def auth_header
        #requesting the header type of authorization (with token) that we will declare through our api requests
        # { Authorization: 'Bearer <token>' }
        request.headers['Authorization']
    end

    def decoded_token
        if auth_header
            #going to take the token and decode it
            token = auth_header.split(' ')[1]
            # header: { 'Authorization': 'Bearer <token>' }
            begin
                puts token
                JWT.decode(token, 's3cr3t') #The header is sending the correct token but returning a fail.
            rescue JWT::DecodeError
                # puts "fail"
                nil
            end
        end
    end

    def logged_in_user
        #consults decode_token to check the header for valid information
        if decoded_token
            puts "Do"
            email = decoded_token[0]['email']
            @user = User.find_by(email: email)
        end
    end

    def logged_in?
        #returns true or false
        !!logged_in_user
    end

    def authenticate_request
        #consults logged_in? see see if user is authorized
        render json: { message: 'Please log in' }, status: :unauthorized unless logged_in?
    end
end

【问题讨论】:

  • 能否在此处添加 encode_token 的代码?
  • @RishiPithadiya 是的,添加了!

标签: ruby-on-rails rails-api


【解决方案1】:

对于解决方案,我发现渲染@user 存在问题。虽然我已经通过rake db:reset 等重置了数据库,但我需要重置 postgres。之后,一切都按预期工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-10
    • 2013-10-05
    • 2014-10-25
    • 2017-08-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多