【问题标题】:ActiveRecord find_by generateing select statement that does not work with postgresActiveRecord find_by 生成不适用于 postgres 的 select 语句
【发布时间】:2018-07-30 19:58:18
【问题描述】:

我在我的 rails api 应用程序中使用 Knock gem 进行 JWT 身份验证。当我使用密码创建用户时,一切都很好,但是当我点击生成 user_token 的路由时,我收到 500 错误。 Knock Gem 在被引用的模型上执行 Activerecord find_by

(this is from https://github.com/nsarno/knock/blob/master/app/controllers/knock/auth_token_controller.rb)
entity_class.find_by email: auth_params[:email]

触发这个选择语句。

User Load (1.0ms)  SELECT  "users".* FROM "users" WHERE "users"."email" = $1 LIMIT $2  [["email", "test@testuser.ca"], ["LIMIT", 1]]

不幸的是,回报是 500

我将 select 语句放入 Postico 并手动运行它仍然失败。那是我发现 Postgres 不喜欢(支持?)值周围的双引号的时候。当我将电子邮件值更改为电子邮件的单引号时,它起作用了

SELECT  "users".* FROM "users" WHERE "users"."email" = 'no-reply@testuser.ca' LIMIT 1 ;

列名周围的双引号似乎没问题。

棘手的是,这只发生在我通过数字海洋水滴设置的生产环境中。我设置了 Capistrano 来部署我的应用程序。在本地,用户创建和 user_token 完美运行。我不确定为什么它在运行代码时会在本地工作,但是当我使用 Postico 访问本地数据库并尝试相同的语句时,它也会崩溃。

任何关于如何解决此问题或为什么会发生这种情况的想法将不胜感激。


发生时的日志文件

[1cbc2966-b7e9-4630-a7e9-07ba13818f2d] puma (3.12.0) lib/puma/thread_pool.rb:133:in `block in spawn_thread'
I, [2018-07-30T19:56:43.531575 #29634]  INFO -- : [a11ba95e-d286-4405-8058-7a8594ba07e1] Started GET "/" for xx.xx.xx.xx at 2018-07-30 19:56:43 +0000
I, [2018-07-30T19:56:43.532229 #29634]  INFO -- : [a11ba95e-d286-4405-8058-7a8594ba07e1] Processing by HomeController#index as HTML
I, [2018-07-30T19:56:43.533500 #29634]  INFO -- : [a11ba95e-d286-4405-8058-7a8594ba07e1] [active_model_serializers] Rendered ActiveModel::Serializer::Null with Hash (0.07ms)
I, [2018-07-30T19:56:43.533660 #29634]  INFO -- : [a11ba95e-d286-4405-8058-7a8594ba07e1] Completed 200 OK in 1ms (Views: 0.4ms)
I, [2018-07-30T20:03:11.491431 #29634]  INFO -- : [fccff2d7-6398-4ff0-883d-26cc1c02d9f8] Started POST "/users/create" for 184.69.39.226 at 2018-07-30 20:03:11 +0000
I, [2018-07-30T20:03:11.492263 #29634]  INFO -- : [fccff2d7-6398-4ff0-883d-26cc1c02d9f8] Processing by UsersController#create as */*
I, [2018-07-30T20:03:11.492443 #29634]  INFO -- : [fccff2d7-6398-4ff0-883d-26cc1c02d9f8]   Parameters: {"user"=>{"email"=>"test@test.ca", "password"=>"[FILTERED]"}}
D, [2018-07-30T20:03:11.582384 #29634] DEBUG -- : [fccff2d7-6398-4ff0-883d-26cc1c02d9f8]    (0.1ms)  BEGIN
D, [2018-07-30T20:03:11.583996 #29634] DEBUG -- : [fccff2d7-6398-4ff0-883d-26cc1c02d9f8]   User Exists (0.7ms)  SELECT  1 AS one FROM "users" WHERE "users"."email" = $1 LIMIT $2  [["email", "test@test.ca"], ["LIMIT", 1]]
D, [2018-07-30T20:03:11.585818 #29634] DEBUG -- : [fccff2d7-6398-4ff0-883d-26cc1c02d9f8]   User Create (0.4ms)  INSERT INTO "users" ("email", "password_digest", "created_at", "updated_at") VALUES ($1, $2, $3, $4) RETURNING "id"  [["email", "test@test.ca"], ["password_digest", "$2a$10$qyZRU.Sxn9mbPI/AQPMnquyiVFKhX8aG8ClPlYdhxivkPQ5XmX0UO"], ["created_at", "2018-07-30 20:03:11.584946"], ["updated_at", "2018-07-30 20:03:11.584946"]]
D, [2018-07-30T20:03:11.586807 #29634] DEBUG -- : [fccff2d7-6398-4ff0-883d-26cc1c02d9f8]    (0.6ms)  COMMIT
I, [2018-07-30T20:03:11.588042 #29634]  INFO -- : [fccff2d7-6398-4ff0-883d-26cc1c02d9f8] [active_model_serializers] Rendered ActiveModel::Serializer::Null with Hash (0.07ms)
I, [2018-07-30T20:03:11.588329 #29634]  INFO -- : [fccff2d7-6398-4ff0-883d-26cc1c02d9f8] Completed 200 OK in 96ms (Views: 1.2ms | ActiveRecord: 5.9ms)
I, [2018-07-30T20:03:15.588367 #29634]  INFO -- : [24372279-3ea9-4f24-b10f-ccd463c3c8b4] Started POST "/user_token" for xx.xx.xx.xx at 2018-07-30 20:03:15 +0000
I, [2018-07-30T20:03:15.589280 #29634]  INFO -- : [24372279-3ea9-4f24-b10f-ccd463c3c8b4] Processing by UserTokenController#create as */*
I, [2018-07-30T20:03:15.589487 #29634]  INFO -- : [24372279-3ea9-4f24-b10f-ccd463c3c8b4]   Parameters: {"auth"=>{"email"=>"test@test.ca", "password"=>"[FILTERED]"}, "user_token"=>{"auth"=>{"email"=>"test@test.ca", "password"=>"[FILTERED]"}}}
D, [2018-07-30T20:03:15.591732 #29634] DEBUG -- : [24372279-3ea9-4f24-b10f-ccd463c3c8b4]   User Load (0.2ms)  SELECT  "users".* FROM "users" WHERE "users"."email" = $1 LIMIT $2  [["email", "test@test.ca"], ["LIMIT", 1]]
I, [2018-07-30T20:03:15.667905 #29634]  INFO -- : [24372279-3ea9-4f24-b10f-ccd463c3c8b4] Completed 500 Internal Server Error in 78ms (ActiveRecord: 0.4ms)
F, [2018-07-30T20:03:15.669634 #29634] FATAL -- : [24372279-3ea9-4f24-b10f-ccd463c3c8b4]
F, [2018-07-30T20:03:15.669803 #29634] FATAL -- : [24372279-3ea9-4f24-b10f-ccd463c3c8b4] TypeError (no implicit conversion of nil into String):
F, [2018-07-30T20:03:15.669896 #29634] FATAL -- : [24372279-3ea9-4f24-b10f-ccd463c3c8b4]
F, [2018-07-30T20:03:15.669994 #29634] FATAL -- : [24372279-3ea9-4f24-b10f-ccd463c3c8b4] jwt (1.5.6) lib/jwt.rb:75:in `digest'
[24372279-3ea9-4f24-b10f-ccd463c3c8b4] jwt (1.5.6) lib/jwt.rb:75:in `sign_hmac'
[24372279-3ea9-4f24-b10f-ccd463c3c8b4] jwt (1.5.6) lib/jwt.rb:36:in `sign'
[24372279-3ea9-4f24-b10f-ccd463c3c8b4] jwt (1.5.6) lib/jwt.rb:96:in `encoded_signature'
[24372279-3ea9-4f24-b10f-ccd463c3c8b4] jwt (1.5.6) lib/jwt.rb:106:in `encode'
[24372279-3ea9-4f24-b10f-ccd463c3c8b4] knock (2.1.1) app/model/knock/auth_token.rb:14:in `initialize'
[24372279-3ea9-4f24-b10f-ccd463c3c8b4] knock (2.1.1) app/controllers/knock/auth_token_controller.rb:22:in `new'

进一步调查

我将本地环境转为“生产”模式,并在本地创建了生产数据库。我遇到同样的 500 内部服务器错误,就像我在访问我的 VPS 时所做的一样,它也处于生产模式!这似乎是 Active Record 的开发和生产以及它如何与 PostgreSQL 一起使用之间的区别?

仍在尝试解决这个问题,如果有人对此有任何经验,请告诉我:)

【问题讨论】:

  • 你也在本地使用 postgres 吗?
  • 是的,我尽量让我的本地和生产环境尽可能接近。
  • 于是我将本地环境转为“生产”模式并创建了生产数据库。我在打我的 VPS 时遇到了同样的问题,那也是在生产模式下!这似乎是开发人员和生产之间的区别以及它如何与 postgres 一起使用。

标签: ruby-on-rails postgresql activerecord jwt


【解决方案1】:

查询很好,与您的问题无关。

您的日志输出显示与 Postgres 无关的错误:

TypeError (no implicit conversion of nil into String):

jwt (1.5.6) lib/jwt.rb:75:in `digest'
jwt (1.5.6) lib/jwt.rb:75:in `sign_hmac'
jwt (1.5.6) lib/jwt.rb:36:in `sign'
jwt (1.5.6) lib/jwt.rb:96:in `encoded_signature'
jwt (1.5.6) lib/jwt.rb:106:in `encode'
knock (2.1.1) app/model/knock/auth_token.rb:14:in `initialize'
knock (2.1.1) app/controllers/knock/auth_token_controller.rb:22:in `new'

【讨论】:

  • 我假设因为查询的值有双引号,所以它返回 nil 而不是实际的行。或者如果查询运行不正确,错误会有所不同吗?
【解决方案2】:

问题似乎源于 Rails 在 5.2 中不再使用机密而是凭据

这是 Knock 的 github 问题 https://github.com/nsarno/knock/issues/205

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-03
    • 2014-08-15
    • 1970-01-01
    • 2021-02-23
    • 2021-07-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多