在Clojure / Luminus网络应用程序中放置一次性设置代码的位置?

时间:2017-02-13 13:26:27

标签: clojure leiningen luminus

在一个简单的Web应用程序中,如果在用户交互开始之前它们不存在,我想创建一些CouchDB设计文档。我知道如果我使用的是SQL数据库,那么我会使用迁移和lein migrate或类似的方法来实现这种效果。

但是,在这里我将使用couch库用JSON创建设计文档,如下所示:

{ "_id": "_design/pages", "language": "javascript", "views": { "by_tag": { "map": "function(doc) {\n if ('tags' in doc) {\n doc.tags.forEach( function(tag) {\n emit(tag, doc._id );\n });\n }\n}\t\n" } } }

我已尝试在inithandler.clj中创建core.clj功能(正如各种Clojure书籍所示),但这绝不会被调用。

我在哪里放这个代码?

1 个答案:

答案 0 :(得分:0)

这就是我的工作......

添加一个用于数据库设置的新模块和一些用于创建视图的函数:

(ns clojure-wiki.models.setup
  (:require [com.ashafa.clutch :as couch]
            [clojure-wiki.models.db :as db]))


(defn create-page-views []
  (db/with-db
    (couch/save-view "pages" (couch/view-server-fns
                               :javascript
                               {:by_tag {:map
"function(doc) {
  if ('tags' in doc) {
    doc.tags.forEach( function(tag) {
      emit(tag, doc._id );
    });
  }
}"
                                         }
                                :by_word {:map
"function(doc) {
  const stopwords = ['and', 'the'];
  var freq = {};
  ((doc._id + \" \" + doc.tags + \" \" + doc.content).toLowerCase().match(/\\w+/g)).forEach(function(word) {
    if (word.length >= 3 && stopwords.indexOf(word) == -1) {
      freq[word] = (freq[word] || 0) +1;
    }
  });
  Object.keys(freq).forEach(function(word) {
    emit(word, {count: freq[word]});
  });
}"
                                          }}))))

(defn setup-db []
  (create-page-views))

project.clj添加任务别名:

:aliases
  {"setup-db" ["run" "-m" "clojure-wiki.models.setup/setup-db"]}

现在我可以将其作为一次性任务运行:

lein setup-db