如何在node + express中重新运行请求处理程序?

我正在运行节点+ 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对象似乎记住,不能build立连接,所以即使mongod已经在运行,服务器也会继续失败。

所以,我想出了以下解决scheme:

 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'); 

基本上它会重新创builddb对象如果一个请求失败,“失败连接”错误并重新运行请求。 这仅在第一次失败时完成。 随后的失败将返回错误。

我根本不喜欢我的解决scheme。 一定有更好的方法。 有什么build议么?

谢谢。

你是什​​么意思,“现有的数据库对象似乎记住,不能build立连接”? 如果在运行mongod之前启动快速应用程序,是否意味着对数据库的查询失败? 由于在快速应用程序启动时连接到数据库,因此应该先运行mongod。

如果您担心在初始连接后数据库closures,导致您的CRUD操作失败,则可以检查操作中的错误

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

然后在出现错误时重新连接。

据我所知,mongodb本地驱动允许设置{ auto_reconnect:true } ,你有没有试图设置?

我不确定如果数据库完全没有运行,这是如何performance的,例如mongoose.jscaching所有请求,直到数据库准备就绪,并在连接成功后发出。