0

私の Node.js サーバー コードは扱いにくく長くなっていたので、最近、関数を個別の .js ファイルにリファクタリングし、requires. 例えば:

//server.js
var queries = require('./routes/queries');
var authenticate = require('./routes/authenticate');
...

//queries.js
var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/test');
exports.SomeFunctionB = ...
...

//authenticate.js
var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/test');
exports.SomeFunctionA = ...
...

ただし、コードを実行するたびに、Mongoose.connect は、閉じられていない接続を開こうとしているというエラーを吐き出します。mongoose.connectこれは、両方の JS ファイルを呼び出しているためだと理解しています。

私はそれを知っているのでServer.js、実際に実行されるNode.jsファイルは前にsが必要ですが、2番目を単純に省略できますか?queries.jsauthenticate.jsmongoose.connect

おそらくより具体的には、ファイルvar mongoose内の はファイル内queriesの と同じ参照ですか?var mongooseauthenticate

そうでない場合、そもそもそのマングース接続を確立する必要があるかどうかをどのようにテストできますか?

4

1 に答える 1

0

monogoose にそのための API メソッドがあるかどうかはわかりません。ただし、別のファイルで接続しようとしてはいけないと思います。一度だけやってみませんか。メインファイル内。フレームワークを使用しているかどうかはわかりませんが、mongoose オブジェクトをリクエストに添付して、すべてのファイルに渡すことができます。mongodb ネイティブ ドライバーを使用する例を次に示しますが、アイデアはよく説明されています。

MongoClient.connect('...', function(err, db) {
    if(err) {
        console.log('Sorry, there is no mongo db server running.');
    } else {
        var attachDB = function(req, res, next) {
            req.db = db;
            next();
        };
        app.all('/admin*', attachDB, function(req, res, next) {
            // run your constroller here
        });         
        app.all('/blog/:id', attachDB, function(req, res, next) {
            // run your constroller here
        });
        app.all('/', attachDB, function(req, res, next) {
            // run your constroller here
        });     
        http.createServer(app).listen(config.port, function() {
            console.log(
                'Successfully connected to mongodb://' + config.mongo.host + ':' + config.mongo.port,
                '\nExpress server listening on port ' + config.port
            );
        });
    }
});

したがって、attachDB は実際には、リクエスト オブジェクトにパッチを適用するミドルウェアです。そのオブジェクトが次のミドルウェアに渡されると、mongodb クライアントにアクセスできるようになります。

于 2013-09-05T21:52:37.280 に答える