我正在运行 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
对象并重新运行请求。仅针对第一次失败执行此操作。随后的失败会返回错误。
我根本不喜欢我的解决方案。一定有更好的方法。有什么建议吗?
谢谢。
最佳答案
“已经存在的数据库对象似乎记得无法建立连接”是什么意思?你的意思是如果你在运行 mongod 之前启动 express 应用程序,对数据库的查询会失败?由于您是在 Express 应用程序启动时连接到数据库,因此您应该首先运行 mongod。
如果您担心初始连接后数据库宕机并导致您的 CRUD 操作失败,您可以检查操作是否有错误
db.inventory.find(function(err, docs) {
// check err to see if there was a connection issue
});
如果出现错误,则重新连接。
关于javascript - 如何在 node + express 中重新运行请求处理程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12216930/