1

node + express + mongojs を実行しています。サンプルコードは次のとおりです。

function mongoCallback(req, res) {
  "use strict";
  return function (err, o) {
    if (err) {
      res.send(500, err.message);
    } else if (!o) {
      res.send(404);
    } else {
      res.send(o);
    }
  };
}

var express, app, params, mongo, db;

express = require('express');
params = require('express-params');
app = express();
params.extend(app);

app.use("/", express.static('web'));

mongo = require('mongojs');

db = mongo.connect('mydb', ['inventory']);

app.get('/api/inventory', function (req, res) {
  db.inventory.find(mongoCallback(req, res));
});

app.listen(8000);
console.log('Listening on port 8000');

mongod の実行を忘れて、データベースと通信しようとすると「... に接続できませんでした」というエラーで失敗することがあります。問題は、mongod を開始するだけでは十分ではないことです。既存のdbオブジェクトは、接続を確立できなかったことを記憶しているように見えるため、mongod が既に実行されていても、サーバーは失敗し続けます。

そこで、次の解決策を思いつきました。

var express, app, params, mongo, db, api;

if (!String.prototype.startsWith) {
  String.prototype.startsWith = function (str) {
    "use strict";
    return this.lastIndexOf(str, 0) === 0;
  };
}

function setDB() {
  db = mongo.connect('IF', ['invoices', 'const', 'inventory']);
}

function mongoCallback(req, res, next, caller, secondTry) {
  return function (err, o) {
    if (err) {
      if (!secondTry && err.message && err.message.startsWith("failed to connect to")) {
        setDB();
        caller(req, res, next, true);
      } else {
        res.send(500, err.message);
      }
    } else if (!o) {
      res.send(404);
    } else {
      res.send(o);
    }
  };
}

express = require('express');
params = require('express-params');
app = express();
params.extend(app);

app.use("/", express["static"]('web'));

mongo = require('mongojs');

setDB();

api = {
  getInventory: function (req, res, next, secondTry) {
    db.inventory.find(mongoCallback(req, res, next, api.getInventory, secondTry));
  }
};

app.get('/api/inventory', api.getInventory);

app.listen(8000);
console.log('Listening on port 8000');

基本的にdb、リクエストが「接続に失敗しました」エラーで失敗した場合、オブジェクトを再作成し、リクエストを再実行します。これは、最初の失敗に対してのみ行われます。その後の失敗では、エラーが返されます。

私は自分の解決策がまったく好きではありません。もっと良い方法があるはずです。助言がありますか?

ありがとう。

4

2 に答える 2

2

「既存の db オブジェクトは、接続が確立できなかったことを覚えているようです」とはどういう意味ですか? mongod を実行する前にエクスプレス アプリを起動すると、データベースに対するクエリが失敗するということですか? Express アプリの起動時に DB に接続するため、最初に mongod を実行する必要があります。

最初の接続後にデータベースがダウンして CRUD 操作が失敗することが心配な場合は、操作のエラーを確認できます。

db.inventory.find(function(err, docs) {
    // check err to see if there was a connection issue
});

エラーが発生した場合は再接続します。

于 2012-08-31T14:34:45.073 に答える
0

私の知る限り、mongodb ネイティブ ドライバーで を設定できますが{ auto_reconnect:true }、これを設定しようとしましたか?

データベースがまったく実行されていない場合、これがどのように動作するかはわかりません。mongoose.jsたとえば、DB の準備が整うまですべてのリクエストをキャッシュし、接続が成功した後にそれらを発行します。

于 2012-08-31T14:49:56.940 に答える