Как использовать глобальное соединение на сервере? - PullRequest
0 голосов
/ 01 февраля 2020

У меня есть база данных mongodb, к которой я подключился, например:

(let [uri  (config-keys :mongoURI)
      {:keys [conn db]} (mg/connect-via-uri uri)])

В Node.js с пн goose, можно сделать mongoose.Promise = global.Promise, чтобы подключиться к базе данных только один раз а затем использовать его из любого файла в глобальном пространстве имен. Как мне сделать это с monger, чтобы мне не приходилось повторять код выше в каждом файле, который использует базу данных, и вместо этого подключаться к ней только один раз?

1 Ответ

0 голосов
/ 04 февраля 2020

Итак, ваш вопрос можно обобщить так: Как мне управлять глобальным состоянием в моем приложении.

Есть несколько библиотек, которые помогут вам сделать это:

  1. component , которая позволяет вам создавать карту глобального состояния, которую вы передаете нужным функциям
  2. mount , которая позволяет вам создавать что-то похожее на глобальные переменные
  3. integrant

Вы также можете сделать это без каких-либо специфических c библиотек, используя промежуточное ПО (при условии, что вы используете ring ):

(defn add-db-to-req [handler uri]
  (fn [req]
    (let [connection (mg/connect-via-uri uri)]
      (handler (assoc req :connection connection)))))

Любое промежуточное программное обеспечение, находящееся ниже по потоку от этого, может получить доступ к соединению с помощью

(:connection req)

и передать его нужным функциям.

Как правило, вместо зависимости от глобального состояния, вы захотите передать connection любой функции, которая зависит от него, как таковая:

(defn fetch-from-database [{:keys [db conn] :as connection} whatever]
  ...)
...