既存の大規模な Node+Express+Mongoose アプリケーションを複数のマウント可能なアプリケーションにモジュール化し、それぞれを個別の NPM パッケージとして開発する試みにおいて、それらの間で単一の Mongoose インスタンスを共有することは良い考えでしょうか?
それぞれがクライアント側のアセット、Mongoose モデル、および Express で実装された REST-API を含む一連の NPM パッケージがあるとします。それらはいくつかの共通の特徴を共有していますが、基本的には別個の再利用可能なアーティファクトと見なされます。ホスト アプリケーションも Express ベースで、さまざまなルート URI の下にこれらをマウントします。
var discussions = require('discussions'),
tickets = require('tickets'),
events = require('events'),
express = require('express'),
app = express();
var environment = { ...see below... };
...
app.use('/events-api', events(environment));
app.use('/tickets-api', tickets(environment));
app.use('/discussions-api', discussions(environment));
ここで、アプリevents
(ホスト経由で取り込まれた別個の NPM パッケージ) は、ホスト アプリケーション自体と同様に Mongoose を使用するため、ホストが使用する他のものも含む何らかの種類のオブジェクトを介して、ホストの Mongoose インスタンスを渡すことを考えました。マウントされたアプリと共有したい。tickets
discussions
package.json
environment
このアプローチに明らかな欠陥はありますか? この場合、マウントされたアプリは、それぞれの で依存関係として Mongoose を指定せず、通常は行われません
が、MongoDB への接続を担当するホストから Mongoose インスタンスを取得します。package.json
require('mongoose')
これが悪い考えで、各サブアプリが独自に Mongoose への依存関係を宣言することを提案する場合、各 NPM パッケージは独自の Mongoose のコピーを取得し、それぞれが MongoDB に接続する必要がありますよね?
背景情報:
- 複数の Node インスタンスを持つのではなく、単一のプロセスで実行されるホスト アプリケーションにアプリを含めたいと考えています。ホストには、認証などのミドルウェアが含まれています。
- ソースをホスト アプリケーションに単にコピーするのではなく、ビルドするさまざまなホスト アプリケーションのバージョン管理された依存関係として含まれる、個別に開発された NPM パッケージとしてアプリを使用したいと考えています。
- マウントされた複数のアプリ間で同じ Mongoose インスタンスを再利用すると、同じモデルの名前空間が共有されることを認識しています。
編集:すべてが編集された後にパッケージ構造を明確にするにはnpm install
:
host/
assets/
models/
routes/
node_modules/
express/ ...
mongoose/ ...
events/
assets/ ...
models/ ...
routes/ ...
tickets/
assets/ ...
models/ ...
routes/ ...
discussions/
assets/ ...
models/ ...
routes/ ...
つまりevents
、、、tickets
およびdiscussions
アプリには独自の Mongoose (または Express) は含まれていませんが、これらの依存関係を提供する常に存在するホスト アプリケーションに依存するように設計されています。
ここでは、 のような NPM パッケージが親からtickets
単純に詰め込むことはできないと
想定していますよね?require