9

既存の大規模な 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 インスタンスを渡すことを考えました。マウントされたアプリと共有したい。ticketsdiscussionspackage.jsonenvironment

このアプローチに明らかな欠陥はありますか? この場合、マウントされたアプリは、それぞれの で依存関係として 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

4

3 に答える 3

7

他のNPMパッケージ間でMongooseパッケージを再利用する場合は、共有パッケージをトップレベルのアプリにインストールし、それを使用して他のNPMパッケージを初期化するのが最善の方法です。

トップレベル:

var db = require('myMongooseDb'),
    events = require('events')(db),
    ...

次に、イベントパッケージは、dbをパラメーターとして受け取る関数をエクスポートする必要があります。

于 2012-10-05T22:28:59.873 に答える
3

この問題を解決した最近公開されたパッケージhttps://github.com/jaredhanson/node-parent-requireをご覧になることをお勧めします。

Github プロジェクト ページのnode-parent-require Readme ファイルには、mongoose を使用した詳細なウォークスルーが記載されています。

基本的に、サブモジュールを掘り下げてこれを置き換える必要があります。

mongoose = require("mongoose");

... これとともに:

try {
  var mongoose = require('mongoose');
} catch (_) {
  // workaround when `npm link`'ed for development
  var prequire = require('parent-require')
    , mongoose = prequire('mongoose');
}

サブモジュールの package.json に mongoose を peerDependency として追加することを忘れないでください。例えば:

"peerDependencies": {
  "mongoose": "3.x"
}

最初にhttp://blog.nodejs.org/2013/02/07/peer-dependencies/を読むこともできます。

于 2013-09-06T10:15:03.010 に答える