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
、リクエストが「接続に失敗しました」エラーで失敗した場合、オブジェクトを再作成し、リクエストを再実行します。これは、最初の失敗に対してのみ行われます。その後の失敗では、エラーが返されます。
私は自分の解決策がまったく好きではありません。もっと良い方法があるはずです。助言がありますか?
ありがとう。