2

只是玩 Luminus,我有一个简单的搜索功能

(def filename "/somewhere/on/my/harddrive")
(defn search [request]
  (let [q (-> request :params :q)]
    (layout/render request "results.html" {:data (helpers/match-lines-from-filename q filename)})))

参观时一切都很好localhost:3000/search?q=foo。但是,当我访问时localhost:3000/search?q=foo&q=bar,出现以下错误

class clojure.lang.PersistentVector cannot be cast to class java.lang.CharSequence

我确切地知道问题出在哪里,第一个 URL 插入{:q "foo"}到参数中,而后者给出了{:q ["foo" "bar"]}. 我可以在我的控制器中使用类似这样的东西进行修复:

(if (string? q) q (last q))

但作为 Luminus 和 Clojure 的初学者,我不确定我是否弄错了。我一直在互联网上搜索现有技术,但没有成功。

我知道Struct 库。这似乎已经到了一半,但是 usingst/string会给出错误“必须是一个字符串”,而不是只取最后一个值。

需要明确的是,我可能会在我自己的代码中停止 500 个错误,但我只是希望 Luminus 文档中的某处有一行可以满足使用多个相同键的工作(TM),而不必大惊小怪。与其他框架进行比较(据我所知,作为我多年未使用的一些框架的信息):

  • Django:返回最后提供的值
  • Rails:采用最后提供的参数,除非键以 [] 结尾,在这种情况下它会强制使用列表。
  • Mojolicious:提供两种不同的返回参数的方法,一种像 Django,另一种总是给出一个列表(甚至是一个空的)
  • Python urlparse:总是返回一个列表

这些中的每一个对我来说都更直观,但是如果我缺少某些东西,请告诉我。

附录

根据@noah-bogart将其转变为特定问题的好建议,这是一个尝试:在我看来,Luminus 中的默认行为通过上面概述的易于重现的客户端机制给出了 500 个错误。其他 Web 框架可以有效地防止这种情况发生,最终开发人员无需支付任何费用,如上所述。Luminus 或更广泛的生态系统中是否有提供此功能的中间件或命名空间?

后附录

为了扩展我在上面写的关于 Django 的内容,该框架具有与 Mojolicious 类似的过程,您可以指定您想要一个列表还是单个值

4

0 回答 0