mongooseモデルで複数回呼び出す必要があります

私は次のように定義されたモンゴースのモデルを持っています:

user.js

module.exports = function() {
  var mongoose = require('mongoose');

 //Creates a new Mongoose Schema object
  var Schema = mongoose.Schema; 

 //Collection to hold users
  var UserSchema = new Schema({
      username: { type: String, required: true },
      password: { type: String, required: true },
    },{ 
      versionKey: false 
    }
  );

 //Creates the Model for the User Schema
  var User = mongoose.model('User', UserSchema);

  var getUserById = function(id, callback) {
    User.findById(id, callback);
  }

  var getUserByUsername = function(username, callback) {
    var query = {username: username};
    User.findOne(query, callback);
  }


  return {
    getUserById: getUserById,
    getUserByUsername: getUserByUsername
  }
}()

基本的に私は、Userモデルのクライアントが使用できる公開インタフェースを返しています。 I.ユーザーのための私のルートは、モデルを取得し、定義された2つのパブリックメソッドを呼び出すことができます。私は私のルートからmongodb/mongooseを使っているという事実を抽象化するためにこれをやっています。私は非常にポストグルにもいくつかのポイントで話す、またはちょうどポストグルに切り替えるかもしれないユーザーモデルを持っている可能性が高いです。したがって、私はmongooseの特定の関数を呼び出したルートメソッドのコードを調べる必要はありません。

ここに私の問題があります。私が呼び出すモジュールが必要なときにコードのほとんどの場所

var someUtil = require('./someUtil');

しかし、私がそれをmongooseモデルに対して複数回実行すると、それを2回定義することはできないというエラーが表示されます。

var User = require('./user'); //Cannot put this in more than one file without getting an error.

user.jsファイルをコード化するより良い方法がありますが、Userモデルにパブリックインターフェイスを提供することはできますが、スキーマを定義するだけで、そのファイルに複数回の呼び出しが必要です。

1
AFAIKノードはモジュールを要求した結果をキャッシュします。したがって、上記の関数を2回実行しないでください。それ以外に、自己実行機能でコードをラップする理由はありません。単に exports.getUserById = getUserById;のようなメソッドを公開するだけです。//etc
追加された 著者 Andreas Hultgren,
AFAIKノードはモジュールを要求した結果をキャッシュします。したがって、上記の関数を2回実行しないでください。それ以外に、自己実行機能でコードをラップする理由はありません。単に exports.getUserById = getUserById;のようなメソッドを公開するだけです。//etc
追加された 著者 Andreas Hultgren,

9 答え

Mongooseモデルをラップするサービスから分離する必要があります。

私はスキーマごとに1つのファイルを持つモデルフォルダを持っていることをお勧めします、各ファイルはこのように少し見えるでしょう:

'use strict';

var mongoose = require('mongoose'),
    Schema = mongoose.Schema

var User = new Schema({
    ...fields your schema will have
})

//additional virtuals or configuration

module.exports = mongoose.model('User', User)

そのモデルを必要とするUserServiceを持つ services フォルダがあります。

var User = require('../models/User')

function UserService(){
    //create User, delete User, etc.
}

module.exports = new UserService()

これからコントローラまたはルートでUserServiceが必要になります。あなたはこの種の問題を抱えず、あなたのコードはより整理されます。

3
追加された

Mongooseモデルをラップするサービスから分離する必要があります。

私はスキーマごとに1つのファイルを持つモデルフォルダを持っていることをお勧めします、各ファイルはこのように少し見えるでしょう:

'use strict';

var mongoose = require('mongoose'),
    Schema = mongoose.Schema

var User = new Schema({
    ...fields your schema will have
})

//additional virtuals or configuration

module.exports = mongoose.model('User', User)

そのモデルを必要とするUserServiceを持つ services フォルダがあります。

var User = require('../models/User')

function UserService(){
    //create User, delete User, etc.
}

module.exports = new UserService()

これからコントローラまたはルートでUserServiceが必要になります。あなたはこの種の問題を抱えず、あなたのコードはより整理されます。

3
追加された

アンドレアスは正しいです:

AFAIK node caches the result of requireing a module, and thus the above function should not be run twice. Other than that there's no reason to wrap you code in a self-executing function, just expose the methods like exports.getUserById = getUserById; //etc.
0
追加された

アンドレアスは正しいです:

AFAIK node caches the result of requireing a module, and thus the above function should not be run twice. Other than that there's no reason to wrap you code in a self-executing function, just expose the methods like exports.getUserById = getUserById; //etc.
0
追加された

私はこの問題にぶつかり、私は私の答えに貢献すると思った。私が持っている問題は、私のスキーマに 'ref'の定義があるので、少し複雑です。私は「なぜ」の一番下にはいませんが、基本的には何らかの形で依存関係のチェーンが原因でノードに同じファイルが2回必要になります。 console.log出力を2回取得すると、これが確認されます。以前のアプローチでは、モデルの代わりにスキーマをエクスポートするしかありませんでしたが、実行開始時にすべてのモデルをブートストラップする必要があったため、これは面倒でした。いくつかの手直しをした後、私はこのパラダイム(coffeescriptを使用)に着きました:

Mongoose = require 'mongoose'

unless 'Foo' in Mongoose.modelNames()
  schema = new Mongoose.Schema
    bar: String
  Mongoose.model 'Foo', schema

module.exports = Mongoose.model 'Foo'
0
追加された

私はこの問題にぶつかり、私は私の答えに貢献すると思った。私が持っている問題は、私のスキーマに 'ref'の定義があるので、少し複雑です。私は「なぜ」の一番下にはいませんが、基本的には何らかの形で依存関係のチェーンが原因でノードに同じファイルが2回必要になります。 console.log出力を2回取得すると、これが確認されます。以前のアプローチでは、モデルの代わりにスキーマをエクスポートするしかありませんでしたが、実行開始時にすべてのモデルをブートストラップする必要があったため、これは面倒でした。いくつかの手直しをした後、私はこのパラダイム(coffeescriptを使用)に着きました:

Mongoose = require 'mongoose'

unless 'Foo' in Mongoose.modelNames()
  schema = new Mongoose.Schema
    bar: String
  Mongoose.model 'Foo', schema

module.exports = Mongoose.model 'Foo'
0
追加された

私はこの問題にぶつかり、私は私の答えに貢献すると思った。私が持っている問題は、私のスキーマに 'ref'の定義があるので、少し複雑です。私は「なぜ」の一番下にはいませんが、基本的には何らかの形で依存関係のチェーンが原因でノードに同じファイルが2回必要になります。 console.log出力を2回取得すると、これが確認されます。以前のアプローチでは、モデルの代わりにスキーマをエクスポートするしかありませんでしたが、実行開始時にすべてのモデルをブートストラップする必要があったため、これは面倒でした。いくつかの手直しをした後、私はこのパラダイム(coffeescriptを使用)に着きました:

Mongoose = require 'mongoose'

unless 'Foo' in Mongoose.modelNames()
  schema = new Mongoose.Schema
    bar: String
  Mongoose.model 'Foo', schema

module.exports = Mongoose.model 'Foo'
0
追加された

私もこの問題にぶつかりました。

あなたができることは、スキーマ定義をtry catchでラップすることです

この行を次のように置き換えます。 var User = mongoose.model( 'User'、UserSchema);

var User;
try {
  User = mongoose.model('User', UserSchema);
}
catch(e) {
  User = mongoose.model('User');
}

それが最良の方法であるかどうかは分かりませんが、うまくいくでしょう。

0
追加された

私もこの問題にぶつかりました。

あなたができることは、スキーマ定義をtry catchでラップすることです

この行を次のように置き換えます。 var User = mongoose.model( 'User'、UserSchema);

var User;
try {
  User = mongoose.model('User', UserSchema);
}
catch(e) {
  User = mongoose.model('User');
}

それが最良の方法であるかどうかは分かりませんが、うまくいくでしょう。

0
追加された