5

次のコードは、コンソールにドキュメントを返すという点で「機能しています」。

var Db = require('mongodb').Db;
var mongoUri = 'mongodb://localhost:27017/basketball';

exports.games = function(req, res){
    console.log(req);
    res.end("list of games");
    Db.connect(mongoUri, function(err, db) {
        console.log('connected!');
        db.collection('game_ids', function(err, coll) {
            coll.findOne({'date' : '2012-12-07'}, function(err, doc) {
                console.log(doc);
            });
        });
        db.close();
    });
};

>
connected!
{ _id: 50b01b31597f14213a00010f,
  date: '2012-12-07',
  espn_id: '400277990',
  hid: '20',
  aid: '2',
  home: '76ers',
  away: 'Celtics',
  season: '2013',
  during: 'regular',
  scrape: null }

しかし、mongodコンソールを見ると、ページを更新するたびに、接続を閉じずに開く接続が増えているように見えます。ここでは、5回の更新後、25の接続が開いていることがわかります(数字を表示するには、右にスクロールする必要があります)。

Sat Dec  8 12:29:32 [initandlisten] connection accepted from 127.0.0.1:57587 #121 (21 connections now open)
Sat Dec  8 12:29:32 [initandlisten] connection accepted from 127.0.0.1:57588 #122 (22 connections now open)
Sat Dec  8 12:29:32 [initandlisten] connection accepted from 127.0.0.1:57589 #123 (23 connections now open)
Sat Dec  8 12:29:32 [initandlisten] connection accepted from 127.0.0.1:57590 #124 (24 connections now open)
Sat Dec  8 12:29:32 [initandlisten] connection accepted from 127.0.0.1:57591 #125 (25 connections now open)

私は何が間違っているのですか?

4

1 に答える 1

9

作業中に接続を閉じようとしています。

    // the work is done in the call back functions
    db.collection('game_ids', function(err, coll) {
        coll.findOne({'date' : '2012-12-07'}, function(err, doc) {
            console.log(doc);
        });
    });

    // the work above with the callback is async, this executes
    // immediately after initiating that work.
    db.close();

すべての呼び出しで開閉する場合は、作業が完了した後(この場合はconsole.log呼び出しの後)に閉じます。

また、すべての呼び出しで開閉する必要がないように、接続プールを調べることもできます。詳細はこちら:

http://technosophos.com/content/nodejs-connection-pools-and-mongodb

また、コールバック関数のエラーをチェックしてエラーチェックを行う必要があります。たとえば、コレクションの取得に失敗した場合は、findOneを実行しないでください。

于 2012-12-08T20:57:20.647 に答える