如何在Node.js中正确关闭MongoDB连接?

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)

我做错了什么?
1个回答

10

在工作正在进行时,您正在尝试关闭连接。

    // 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等操作...

谢谢!那很有道理。我猜我还没有完全理解 Node 的异步编程。 :) - Evan Zamir
2
您回答中的链接已失效。 - I0_ol

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接