在luminus项目中使用swigger设置中的cprop env信息

问题描述 投票:2回答:1

我正在使用swagger为db访问程序提供API。在开发过程中,我通常会运行2个版本,dev版本和我在登录时自动启动的prod版本。我想在swagger首页上看到一个不同的标题,所以我不小心丢弃了我的实时数据库。到目前为止,我一直在swagger设置中手动编辑title字段,但这很容易出错,我经常忘记在运行lein uberjar来构建prod版本之前更改它。

env设置似乎是一种理想的方法。 luminus lein模板已经使用了一个从dev和prod配置文件构建的env映射,它工作正常,允许我自动为2个版本指定不同的端口。我添加了一个条目,给了我一个prod和dev版本不同的标题。我可以从repl中看到它,但在swagger规范中包含它只是给null

screenshot of swagger html page

这是从我的photo-api.routes.services.clj文件开头的swagger定义:

(ns photo-api.routes.services
  (:require [cheshire.core                     :as json]
            [compojure.api.sweet               :refer :all]
            [image-lib.images                  :as ilim]
            [image-lib.preferences             :as ilpf]
            [image-lib.projects                :as ilpr]
            [image-lib.write                   :as ilwr]
            [photo-api.db.core                 :as db]
            [photo-api.config                  :refer [env]]
            [photo-api.routes.helpers.build    :as build]
            [photo-api.routes.helpers.keywords :as keywords]
            [photo-api.routes.helpers.open     :as open]
            [photo-api.routes.helpers.photos   :as photos]
            [photo-api.routes.helpers.projects :as projects]
            [ring.util.codec                   :refer [url-decode]]
            [ring.util.http-response           :refer [ok]]
            [schema.core                       :as s]
            [clojure.string                    :as str]))

(defapi service-routes
  {:swagger {:ui "/swagger-ui"
             :spec "/swagger.json"
             :data
             {:info
              {:version "1.0.1"
               ;; Switch to correct title before lein uberjar
               ;; TODO Automate this so swagger page always shows dev or prod version
               ;;:title "Photo API"
               :title (:title env)
               :description "Access a mongo database containing details of photos"}}}}

注释掉:标题规范工作正常,但(:title env)调用不会,尽管它是我可以从repl成功使用的完全相同的调用。我相信env地图是作为photo-api.config的一部分构建的,当我启动服务器时,启动消息看起来像是在http服务器之前成功启动了:

{:started
 ["#'photo-api.config/env"
  "#'photo-api.db.core/db*"
  "#'photo-api.db.core/db"
  "#'photo-api.handler/init-app"
  "#'photo-api.handler/app"
  "#'photo-api.core/http-server"]}
user> 

这是photo-api.config,与luminus默认值相同:

(ns photo-api.config
  (:require [cprop.core :refer [load-config]]
            [cprop.source :as source]
            [mount.core :refer [args defstate]]))

(defstate env :start (load-config
                       :merge
                       [(args)
                        (source/from-system-props)
                        (source/from-env)]))

和dev config.edn文件:

{:title "**** Photos Development API ****"
 :dev true
 :port 31999
 ;; when :nrepl-port is set the application starts the nREPL server on load
 :nrepl-port 57251}

我错过了一些明显的东西吗?是否还需要另一个步骤才能使env地图对于swagger设置可见?

编辑:将调用从(:title env)更改为(env:title)会导致cider-jack-in失败并显示一条长错误消息/堆栈跟踪,其中包括:

Caused by: java.lang.ClassCastException: mount.core.DerefableState cannot be cast to clojure.lang.IFn

再次将其更改为(@env :title)然后会给出类似的长错误消息/堆栈跟踪,其中包含:

Caused by: java.lang.ClassCastException: mount.core.NotStartedState cannot be cast to clojure.lang.IFn, compiling:(services.clj:29:23)

因此看起来env在从swagger设置调用它之后才开始启动。我仍然不知道为什么当cider-jack-in工作时它清楚地显示了在http-server之前启动的config.env状态。 (往上看)

clojure luminus
1个回答
0
投票

它看起来像(defstate env) 是一个原子 需要做derefed。 Mount's README指向some examples 的测试。

你可以在(:title @env)尝试service-routes

(defapi service-routes
  {:swagger {:ui "/swagger-ui"
             :spec "/swagger.json"
             :data
             {:info
              {:version "1.0.1"
               ;; Switch to correct title before lein uberjar
               ;; TODO Automate this so swagger page always shows dev or prod version
               ;;:title "Photo API"
                 :title (:title @env) ;;;--------> UPDATED
                 :description "Access a mongo database containing details of photos"}}}}

编辑 -

不是原子。请参阅this issue了解相同的deref错误,这可能意味着不需要deref。

© www.soinside.com 2019 - 2024. All rights reserved.