我正在 Clojure 中使用 Ring、Compojure、clojure.java.jdbc
和 MySQL 编写一个简单的 URL 缩短器。
我看到一个非常奇怪的问题,其中一些输入似乎在函数中途随机变为空,导致我的检查失败。
我的代码:
(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 not find:”。日志显示非常奇怪的行为:
{:slug "eel", :url "eel.com"}
Not running. Mapping: nil
响应是 404,消息为 Slug not find: eel.com
- 更奇怪的是,因为它似乎返回的是 url 而不是响应中的 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)))
知道这里发生了什么吗?
最佳答案
我理解您的困惑,因为考虑到您发布的代码,对 redirect-handler
的一次调用不可能产生这些日志消息,无论它接收什么值作为参数,也无论db/get-slug
返回的内容。局部变量根本无法改变值,并且 Clojure 中不存在从 true 到 falsey 的单一值。
我可以想到两种解释(也许还有其他解释):
- 您发布的代码不是正在运行的代码。例如,也许您重写了该函数但没有重新加载它。
- 日志消息不仅仅来自
redirect-handler
。也许其他函数在第一行打印 map ,然后第二行是redirect-handler
打印的唯一内容。
关于mysql - JDBC 返回的 Clojure 映射在检查后变为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73765537/