【发布时间】: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