假设我正在做一个Web应用程序,它公开API来获取和改变有关猫的数据。
我正在使用Korma实现我的数据库层,所以会有类似的东西:
(ns kittens.db
(:require [korma.core :refer :all]))
(defn fetch-cats [db]
(select cats-table ...))
(defn fetch-cat-by-id [db id]
(select cats-table
...
(where {:id id})))
(defn create-cat [db data]
(insert cats-table
...))
...
...
我按如下方式实现API路由后:
(ns kittens.routes
(:require [compojure.core :refer [defroutes GET POST ...]]
[kittens.db :as db]))
(defroutes cats-routes
(GET "/cats" [...] (db/fetch-cats ...))
(GET "/cats/:id" [...] (db/fetch-cat-by-id ...))
(POST "/new-cat" [...] (db/create-cat ...)))
在这样的实现中,routes
模块直接与db
模块进行对话,这对我来说似乎不太灵活。它们之间应该有什么东西吗?
答案 0 :(得分:2)
在我看来,你不需要任何其他东西,这很好。
这样的设置已经非常灵活。
看起来一切看起来都不错,随着事情的发展,这里有一些一般的建议:
避免使用逻辑路径体。 如果路线的主体开始增长,请考虑将其提取到某个功能。 路线测试的乐趣不大。
将您的路由和处理程序中间件共存,除非您需要将这么多路由拆分为上下文。
确保您的处理程序直接引用路由var#'而不是路由,以便重新加载路由。