Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure 在luminus项目中的swagger设置中使用cprop env信息_Clojure_Luminus - Fatal编程技术网

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

Clojure 在luminus项目中的swagger设置中使用cprop env信息,clojure,luminus,Clojure,Luminus,我正在使用swagger为db访问程序提供API。在开发过程中,我通常会运行两个版本,dev版本和prod版本,我会在登录时自动启动。我希望在“招摇过市”的首页上有一个不同的标题,这样我就不会意外地破坏我的live数据库。到目前为止,我一直在swagger设置中手工编辑标题字段,但这很容易出错,在运行lein uberjar构建产品版本之前,我经常忘记更改它 env设置似乎是实现这一点的理想方法。luminus-lein模板已经使用了一个从dev和prod-config文件构建的env-map,

我正在使用swagger为db访问程序提供API。在开发过程中,我通常会运行两个版本,dev版本和prod版本,我会在登录时自动启动。我希望在“招摇过市”的首页上有一个不同的标题,这样我就不会意外地破坏我的live数据库。到目前为止,我一直在swagger设置中手工编辑标题字段,但这很容易出错,在运行
lein uberjar
构建产品版本之前,我经常忘记更改它

env设置似乎是实现这一点的理想方法。luminus-lein模板已经使用了一个从dev和prod-config文件构建的env-map,它运行良好,允许我为2个构建自动指定不同的端口。我在这些文件中添加了一个条目,它给了我一个在prod和dev版本中不同的标题。我可以从repl中看到它,但是将它包含在swagger规范中只会给出
null

这是我的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规范可以正常工作,但是
(: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}
我是不是漏掉了什么明显的东西?是否还需要另一个步骤使环境贴图对swagger设置可见

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

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设置调用它之后才启动。我仍然不知道为什么当苹果酒插口工作时,它清楚地显示了在http服务器之前开始的config.env状态。(见上文)

看起来
(defstate env)
是一个需要进行
deref
ed的原子。指向要进行的测试

您可以在
服务路线中尝试
(:title@env)

(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"}}}}
编辑--


一个原子也没有。请参阅以获取相同的deref错误,这可能意味着不需要deref。

env是一个持久化的AshMap,而不是一个原子。从repl调用(:title env)会给出预期的标题字符串,但(:title@env)会引发错误:ClassCastException clojure.lang.PersistentHashMap无法转换为java.util.concurrent.Future clojure.core/deref-Future(core.clj:2290)Hmm。。。不知道为什么它可以从REPL。。。我想知道
服务路线
本身是否需要
Mount
ed