1

Mongoose 経由で簡単なクエリを作成して MongoDB を監視するための小さなノードを作成しています。何かが返された場合、サービスは利用可能とみなされます。これが私のスクリプトです

var res;
var logPrefix = '[MongoDB]';
var counter = 0;

var mongoose = require('mongoose');
// Simple schema and model for getting a companyprofiles document
var companyProfile = new mongoose.Schema({
    _id: String
});
companyProfile.virtual('Id').get(function () {return this._id});

function closeConnection() {
    console.log('8');
    mongoose.connection.close(function () {
        console.log('9');
        console.log('%s Closed connection%d', logPrefix, counter);
    });
}

function connectAndCheckHealth() {
    console.log('2');
    mongoose.connect('mongodb://localhost:27017/testdb');

    console.log('3');
    mongoose.connection.on('error', function(err) {
        console.log('%s Error connecting to DB:\n%s %s', logPrefix, logPrefix, err);
        res.send(503, 'ERR');
    });

    mongoose.connection.on('open', function() {
        mongoose.connection.db.serverConfig.options.auto_reconnect = false;
    });

    console.log('4');
    mongoose.connection.on('connected', checkHealth);

    console.log('5');
    mongoose.connection.on('close', function() {
        console.log('%s Connection to MongoDB closed %d', logPrefix, counter);
    });
}

function checkHealth() {
    console.log('6');
    cpModel = mongoose.model('companyProfile', companyProfile, 'companyprofiles');
    cpModel.findById('spin', handleModelResponse);
}

function handleModelResponse(error, doc) {
    console.log('7');
    closeConnection();
    console.log('10');
    if (error !== null) {
        console.log('11');
        console.log('%s Error handling response from model:\n%s %s', logPrefix, logPrefix, error);
        res.send(503, 'ERR');
    } else {
        console.log('12');
        if (doc.Id.match(/company1/)) {
            console.log('13');
            console.log('%s App status is ok', logPrefix);
            res.send(200, 'OK');
        } else {
            console.log('14');
            console.log('%s Couldn\'t find the spin company profile. Found %s', logPrefix, doc.Id);
            res.send(503, 'ERR');
        }
    }
}

module.exports = {
    health: function(response) {
        counter++;
        var date = new Date();
        console.log('%s Retrieving health from MongoDB at %s', logPrefix, date);
        res = response;
        console.log(mongoose.connection);
        console.log('1');
        connectAndCheckHealth();
        console.log('15');
    }
}

ご覧のとおり、スクリプトに console.log の行に数字を追加して、制御フローを試してみました。出力は次のとおりです。

1
2
3
4
5
15
6
6
6
7
8
[MongoDB] Connection to MongoDB closed 3
[MongoDB] Connection to MongoDB closed 3
[MongoDB] Connection to MongoDB closed 3
9
[MongoDB] Closed connection3
10
12
13
[MongoDB] App status is ok
7
8
9
[MongoDB] Closed connection3
10
12
13
[MongoDB] App status is ok

/home/GTP/healthcheck/node_modules/mongoose/lib/utils.js:413
        throw err;
              ^
Error: Can't set headers after they are sent.

6 が 3 回表示されることに注意してください (接続後のコールバック)。複数の接続を開いている理由がわかりません。自動接続をオフにして、リクエストごとに接続を閉じています。

どんな助けでも大歓迎です。

4

2 に答える 2

3

Mongooseは、デフォルトで5つの接続のプールを開きます。単一の接続のみが必要な場合は、connect呼び出しを次のように変更できます。

mongoose.connect('mongodb://localhost:27017/testdb', { server: { poolSize: 1 }});
于 2012-11-06T16:15:59.677 に答える
1

db.once('open') はうまくいきました。

自分のページをテストしているときに、フォームを 2 回すばやく送信すると、既に送信されたヘッダーに関するエラーが発生していることに気付きました。これはそれを止めました。

于 2013-08-17T01:23:10.933 に答える