مشکل ارسال درخواست در تابع غیر اکشن


#1

با درود خدمت شما دوستان گرامی . متاسفانه تیتر بهتری برای این موضوع پیدا نکردم به همین ترتیب سوالمو به این صورت مطرح می کنم

به کد زیر توجه فرمایید :

def user_info(conn, %{"token" => _token, "ptoken" => ptoken} = allreq) do
  http_error_handeller(conn, Login.user_info_user_sender(allreq), "user info")
end

خوب این کد می یاد و درخواست رو به این تابع می فرسته :‌

def user_info_user_sender(params) do
    sender_json_with_authorization(params, "users/user-info")
  end

  defp sender_json_with_authorization(params, link) do

    code = "Bearer #{params["token"]}"
    body = Jason.encode!(params)

    HTTPoison.post(
      "#{@link}#{link}",
       body,
        [
          {"Content-Type", "application/json; charset=UTF-8"},
          {"authorization", code},
        ],
       [timeout: 50_000, recv_timeout: 50_000]
    )
  end

خوش و خورم همه چیز بر می گرده و بدون مشکل ما می تونیم کاری که می خوایم رو انجام بدیم . این به صورتی بود که من اگر بیام از فانکشن اکشن استفاده کنم

حالا فرض کنیم من اومدم و به این صورت عمل کردم. این دفعه توکن گرفتم بین اون ++++ دستی خودم قرار دادم در یک مپ و اون رو دوباره به همون تابع بالای سندر ارسال کردم.

   def create_post_category(conn, %{
      "title" => _title,
      "token" => token} = allreq) do
        IO.puts "+++++++++++++++++++++++"
        IO.inspect check_acl_of_post(%{token: token})
        IO.puts "+++++++++++++++++++++++"
        conn
        |> put_status(200)
        |> json(%{output: "test"})
   end

   def check_acl_of_post(token) do
     TrangellApiGateway.User.Login.user_info_user_sender(token)
   end

متاسفانه نمی دونم چرا در اون وب سرویسی که درخواست داره ارسال می شه ارور دارم و ارور به شرح زیر هست

[error] #PID<0.829.0> running TrangellUsersServiceWeb.Endpoint terminated
Server: localhost:4021 (http)
Request: POST /api/users/user-info
** (exit) an exception was raised:
    ** (ArgumentError) argument error
        :erlang.bit_size(nil)
        (trangell_users_service) lib/trangell_users_service/login/db/redis_query.ex:110: TrangellUsersService.Login.Db.RedisQuery.get_field_from_record/3
        (trangell_users_service) lib/trangell_users_service/login/security/security.ex:18: TrangellUsersService.Login.Security.Security.convert_redis_number/1
        (trangell_users_service) lib/trangell_users_service/login/plugs/ban_ip_checker.ex:13: TrangellUsersService.Login.Plugs.BanIpChecker.call/2
        (trangell_users_service_web) lib/trangell_users_service_web/router.ex:4: TrangellUsersServiceWeb.Router.api/2
        (trangell_users_service_web) lib/trangell_users_service_web/router.ex:1: anonymous fn/1 in TrangellUsersServiceWeb.Router.__match_route__/4
        (phoenix) lib/phoenix/router.ex:273: Phoenix.Router.__call__/1
        (trangell_users_service_web) lib/trangell_users_service_web/endpoint.ex:1: TrangellUsersServiceWeb.Endpoint.plug_builder_call/2
        (trangell_users_service_web) lib/plug/debugger.ex:99: TrangellUsersServiceWeb.Endpoint."call (overridable 3)"/2
        (trangell_users_service_web) lib/trangell_users_service_web/endpoint.ex:1: TrangellUsersServiceWeb.Endpoint.call/2
        (plug) lib/plug/adapters/cowboy/handler.ex:15: Plug.Adapters.Cowboy.Handler.upgrade/4
        (cowboy) /Applications/MAMP/htdocs/elixir-ex-source/Trangell_Main/trangell_users_service_umbrella/deps/cowboy/src/cowboy_protocol.erl:442: :cowboy_protocol.execute/4

اگر توجه کرده باشید من حتی از همون تابع ارسال کننده استفاده کردم که در قطعه کد اول ارسال کردم فقط اومدم این سری توکن رو ارسال کردم

برای اینکه اطلاعات کامل تری رو بزارم فانکشن مقصد در وب سرویس یوزر به شرح زیر هست

  def user_info(conn, %{"token" => token}) do
    case TokenManagement.get_user_by_token(token) do
      {:error, :delete_token, er} ->
        conn
        |> put_status(403)
        |> json(%{error_code: "403", error_type: "#{er}"})
      {:ok, params} ->
        conn
        |> put_status(200)
        |> json(params)
    end
  end

یعنی فقط یک ورودی token می خوادکه منم دارم به صورت مپ می فرستم ولی ارور می ده و ارور ۵۰۰ متاسفانه


#2

جالبه بیشتر تست کردم دیدم که اگر last_ip نزارم جزو مپم این مشکل می یاد و اون حرف های بالا اصلا مهم نیست . جالب تر از اون اینکه من اصلا در این فانکشن last_ip نیاز ندارم :smile:

حالا هرچی می گردم من اصلا نیازی جایی last_ip نخواستم حتی اگر خواستم باشم بجای ۴۰۰ چرا داره بهم ارور ۵۰۰بر می گردونه شیطون شده :disappointed_relieved:

جالبه کل تابع اینه

  def get_user_info(conn, %{"token" => token}) do
    case TokenManagement.get_user_by_token(token) do
      {:ok, params} ->
        IO.inspect params
        conn
        |> put_status(200)
        |> json(params)
      {:error, :delete_token, er} ->
        IO.inspect er
        conn
        |> put_status(403)
        |> json(%{error_code: "403", error_type: "#{er}"})
    end
  end

شما توی این last_ip می بینید ؟ با last_ip بهش رکوست بدم تمیز کار می کنه بدون اون ارور ۵۰۰ می ده


#3

خدایا منو بکش چه سوتی دادم . بهتره نگم
درست شد :grin:
دو روز طول کشید بفهمم :expressionless:

شرح مشکل از اینجا شروع می شه من یک پلاگی رو نوشتم که سراسری بر روی همه فانکشن ها کار کنه ولی ذهنم بهش قد نمی داد . و متاسفانه کنسول هم موقع ارور اصلا همراهی نمی کرد یک ارور بی معنی . اونجا یک متغییر می خواست و چک کردم دیدم نوع نوشتنم نیز جالب نیست . و اون رو ویرایش کردم.

در لینک زیر تغییرمو می زارم


#4

puts ارور میده, توی action بجای puts از inspect استفاده کن اول تا بقیشو چک کنم.

باید سر فرصت بخونم


#5

مشکل که حل شده توماج جان . همه نوع ارور برگشت داده حز اروری که مربوط باشه به یک پلاگ دست ساز کنار پروژه . متاسفانه اونجا ارور می داده ولی تو کنسول مشخص نبوده وگرنه واقعا در زمان کوتاه تری انجام می شد


#6

کلا منظورم این بود که از puts استفاده نکن بیشتر گیج کنندست


#7

آها . نه ازش استفاده نمی کنم فقط برای چاپ مثلا ========= برای تفکیک در ترمینال و puts نمی تونه مپ رو خوب چاپ کنه یا برخی از موارد ارور می ده بخاطر همین از inspect استفاده می کنم

ممنون از تذکرت توماج جان


#9

اوکی متوجه شدم اما بدون توضیح خیلی کمکی به درک موضوع نشده، خیلی نیاز به دقیق شدن داره. اما ارور زیاد هم ب معنی نیست