【问题标题】:Clojure map returned by JDBC becomes null after inspectionJDBC返回的Clojure map检查后变为null
【发布时间】:2022-11-30 00:37:33
【问题描述】:

我正在使用 Ring、Compojure、clojure.java.jdbc 和 MySQL 在 Clojure 中编写一个简单的 URL 缩短器。

我看到一个非常奇怪的问题,一些输入似乎在函数中途随机变为 null,导致我的检查失败。

我的代码:

(defn redirect-handler [slug]
  (if (not slug)
    (response/bad-request "Must provide slug."))
  (let [mapping (db/get-slug slug)]
    ;; this passes fine
    (if mapping
      (println (str mapping)))

    ;; this always calls the else case for some slugs, but not others
    (if mapping
      (response/redirect (:url mapping))
      (do
        (println "Not running. Mapping: " mapping)
        (response/not-found (str "Slug not found: " slug))))))

对于某些输入,它总是返回 404 和“未找到 Slug:”。日志显示非常奇怪的行为:

{:slug "eel", :url "eel.com"}
Not running. Mapping:  nil

响应是带有消息Slug not found: eel.com的 404 - 甚至更奇怪,因为它似乎正在返回网址而不是响应中的 slug 。就好像数据在函数的中途被修改了一样。

我已经确认数据库中的数据是正确的。

我的数据库代码:

(def mysql-db (edn/read-string (slurp "env.edn")))

(def query-slug-sql "SELECT * FROM urls WHERE slug = ?")

(defn get-slug [slug]
  (first (j/query mysql-db [query-slug-sql slug])))

我的 HTTP 路由代码:

(defroutes app-routes
  (GET "/:slug" [slug] (redirect-handler slug))
  (GET "/" [] (response/not-found "Must provide slug."))
  (POST "/create" [slug url] (create-handler slug url)))

(def app
  (-> app-routes
      (json/wrap-json-params)
      (json/wrap-json-response)))

知道这里发生了什么吗?

【问题讨论】:

    标签: mysql clojure ring compojure


    【解决方案1】:

    我理解您的困惑,因为根据您发布的代码,对redirect-handler 的单次调用不可能产生这些日志消息,无论它作为参数接收什么值,也无论db/get-slug 返回什么。局部变量根本不能改变值,而且在 Clojure 中没有一个值可以从 truthy 变为 falsey,从来没有。

    我可以想到两种解释(也许还有其他解释):

    1. 您发布的代码不是正在运行的代码。例如,也许您重写了函数但没有重新加载它。
    2. 日志消息不仅仅来自redirect-handler。也许其他一些功能在第一行打印地图,然后第二行是redirect-handler唯一打印的东西。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-01
      • 2018-12-30
      • 2020-09-24
      • 2012-08-08
      • 2021-04-11
      • 2019-05-08
      • 1970-01-01
      • 2018-03-24
      相关资源
      最近更新 更多