15

Express 3.x と mongoose 3.6.4 を使用しています。

これまでのところ、エクスプレスapps.jsファイルで次のようにマングース接続を作成しています。

var mongoose = require('mongoose');
mongoose.connect('mongodb://127.0.0.1:27017/mytest');

次に、次のように、モデルをモデル/ユーザーなどの個別のファイルに分割しました。

var mongoose = require("mongoose");
var Schema = mongoose.Schema;
var ObjectId = Schema.ObjectId;

var userSchema = new Schema({
userId: ObjectId,
givenName:String ...
});

exports.User = mongoose.model('User', userSchema);

そして、複数のルーティング ファイルで、次のように User モデルを使用しました。

var User = require('./models/user').User;
User.findById(id, function(err, user){ ...

これは、ローカル開発にうまく機能しています。すべてのモデルが同じ接続を共有します。

しかし、今は mongoose.createConnection() を使用して、同様の方法で使用できる接続プールを作成したいと考えています。アプリの起動時に接続プールを確立し、すべてのモデルでプールを使用したいと考えています。だから、私はこれを試しました:

var conn = mongoose.createConnection("localhost","dpatest", 27017,{user:"???",pass:"???"});

ただし、モデルは自動的に接続を共有しません。そのため、接続をエクスポートしてモデルで使用しようとするなど、さまざまなことを試しました。ただし、モデルごとに個別の接続を設定する以外は何も機能していません。

mongoose.createConnection() を使用して単一の接続プールを作成する方法を誰かが説明できますか?

私の質問の詳細は次のとおりです。

/************ app.js *****************/
var http = require('http');
var path = require('path');
var express = require('express');
//these are my routing files
var auth = require('./src/auth');
var profile = require('./src/profile');
var admin = require('./src/admin');
var tx = require('./src/tx');
var system = require('./src/system');
var servicing = require('./src/servicing');

var dbUri;
var dbUser = "?????";
var dbPass = "?????";

//here are my configurations for development and production
app.configure('development', function(){
    app.set('port', 3460);
    app.use(express.errorHandler());
    dbUri = "mongodb://mongodb://127.0.0.1:27017/dpatest";
});

app.configure('production', function(){
    app.set('port', 3461);
    dbName = 'dpa';
    dbUri = "mongodb://"+dbUser+":"+dbPass+"@ds052525.mongolab.com:51437/dpa";
});

/*
this is what I was originally using for development
and want to change for deployment
*/
mongoose.connect(dbUri);

これは私が移動する予定だったものです:

var conn = mongoose.createConnection(dbUri);

私のモデル (5 つの異なるモデル) は、アプリのルートから src/models という名前のディレクトリにあります。たとえば、ユーザー モデル:

/************ user.js *************/
var mongoose = require("mongoose");
var Schema = mongoose.Schema;
var ObjectId = Schema.ObjectId;
var userSchema = new Schema({
    userId: ObjectId,
    givenName: String, ...
});

次のようにエクスポートされていました。

exports.User = mongoose.model('User', userSchema);

次に、モデルは次のようにさまざまなルーティング ファイルで使用されます。

/****************auth.js**************/
var User = require('./models/user').User;

exports.createAccount = function(req, res){
    var user = new User({});
    . . . 
    user.save(function(err, usr){

    });
};

mongoose.connect() を mongoose.createConnection に置き換えて、複数のモジュールで動作させる方法の具体的な例を探しています。セルゲイの答えは有望に見えますが、ルーティング ファイルでモデルを参照する方法がわかりません。私は試した:

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

しかし、それを機能させることができませんでした。参照エラーをスローし続けます。

ありがとう!

4

4 に答える 4

4

models フォルダーに index.js を作成します

例えば

    module.exports = function (mongoose,  dbconn) {
        return {

            modelname:  require("./file" )(mongoose, dbconn),
            modelname2:  require("./file2" )(mongoose,  dbconn),
   };
};

次に、それをメインの起動ファイル ファイルにロードし、そこで db 接続を作成します。

var models    = require("./models")(mongoose,dbconn);

models フォルダー内のサンプル モデル ファイルは次のようになります。

module.exports = function (mongoose,  dbconn) {
    /*
     * 
     */
    var schema = new mongoose.Schema({
        /**
         * field
         * @type String
         */
        field: String......
      });

  return dbconn.model("modelname", schema, "collectioname");
};

等々....

于 2013-04-11T20:07:36.170 に答える
4

しばらく経っていることは知っていますが、この記事を見つけて、皆さんがどう思うか疑問に思っていました。エレガントに見えます。 https://productbuilder.wordpress.com/2013/09/06/using-a-single-global-db-connection-in-node-js/

基本的には、Node.js の global.varName メカニズムを使用して接続をグローバルに共有します。

ところで、私は自分で試してみましたが、シームレスに機能しました。

于 2015-11-15T10:20:32.207 に答える