只是玩 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 类似的过程,您可以指定您想要一个列表还是单个值。