mysql - JDBC 返回的 Clojure 映射在检查后变为 null

标签 mysql clojure ring compojure

我正在 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 的单一值。

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

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

关于mysql - JDBC 返回的 Clojure 映射在检查后变为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73765537/

相关文章:

java - 如何使用 netbean 将印地语记录插入 mysql

用于执行多个准备好的查询更新的 PHP 代码在第二次迭代时失败并出现重复键错误

mysql - SQL 值得从 utf8_general_ci 更新到 utf8_unicode_ci 吗?

Clojure函数调用性能

pdf - 如何使用ring提供pdf流服务

clojure - 如何使用 ClojureScript 和 Figwheel 与后端通信?

mysql - 计算日期间隔mysql之间的总和

clojure - *allow-unresolved-vars* 在 Clojure 中做什么?

maven - 使用 maven-release-plugin 将额外的 jar 部署到存储库

clojure - 您如何使用 Reitit 在 Clojure 中设置中间件以启用主体参数的强制转换?