Не удается загрузить элементы в базу данных с помощью Congomongo - PullRequest
1 голос
/ 04 марта 2011

Я использую библиотеку congomongo в двух процессах.Один из процессов взаимодействует с базами данных без ошибок.У другого процесса больше проблем.Если я пытаюсь взаимодействовать с базой данных из этих процессов, то это тоже не проблема, но если я пытаюсь взаимодействовать через telnet, то все плохо работает.

Командная строка:

joshua@joshua-Aspire-5251:/data/db$ telnet localhost 4576
Trying ::1...
Connected to localhost.localdomain.
Escape character is '^]'.
http://news.ycombinator.com/item?id=2286907
Connection closed by foreign host.

Реакция сервера

http://news.ycombinator.com/item?id=2286907
Processing link.
Validating link.
Scraping item.
Wikifying items.
Uploading items.

Из отчета:

(process-link "http://news.ycombinator.com/item?id=2286907")

Реакция сервера:

http://news.ycombinator.com/item?id=2286907
Processing link.
Validating link.
Scraping item.
Wikifying items.
Uploading items.

Единственное функциональное отличие?Один фактически помещает элементы в базу данных, а другой - нет.Оба, кажется, выполняют все остальное.

(ns hnparser.main
  (:use somnium.congomongo
    [hnparser.core :only [scrape-item]]))

(mongo! :db "hacker-archives")

(defn valid-link?
  [link]
  (do
    (println "Validating link.")
    (not= nil (re-matches #"http://news\.ycombinator\.com/item\?id=\d+" link))))

(defn wikify [item]
  (dissoc (assoc item :wiki [{:title (:title item)
                  :author (:user item)
                  :body (:body item)
                  :date (:date item)
                  :reason "Original post."}])
      :title :user :body :date))

(defn wikify-items [items]
  (do
    (println "Wikifying items.")
    (map wikify items)))

(defn upload-item
  [item]
  (if (nil? (fetch-one :items :where {:id (:id item)}))
    (insert! :items (assoc item :scrape-date (java.util.Date.)))))

(defn upload-items
  [items]
  (do
    (println "Uploading items.")
    (map upload-item items)))

(defn process-link
  [link]
  (do
    (println "Processing link.")
    (if (valid-link? link)
      (upload-items (wikify-items (scrape-item link))))))


(ns hnparser.server
  (:use clojure.contrib.server-socket
    hnparser.main)
  (:import [java.io PushbackReader InputStreamReader]))

(defn read-links
  [is os]
  (let [in-reader (PushbackReader. (InputStreamReader. is))]
    (let [input (str (read in-reader))]
      (do
    (println input)
    (process-link input)))))

(defn -main
  []
  (def *server* (create-server 4576 read-links)))

Обратите внимание, что это успешно очищается (проверено с помощью операторов печати).Он просто не загружается в базу данных.

1 Ответ

4 голосов
/ 04 марта 2011

Карта ленива: вы никогда не должны использовать карту, когда вы хотите побочные эффекты вместо возвращаемых значений. Вы можете обернуть карту с помощью dorun, но в большинстве случаев проще использовать дозаq.

Также defn имеет неявное do, поэтому (fn [x] (do (println x) (inc x))) совпадает с (fn [x] (println x) (inc x)).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...