Javascript 如何在节点+;快车?

Javascript 如何在节点+;快车?,javascript,node.js,mongodb,express,node-mongodb-native,Javascript,Node.js,Mongodb,Express,Node Mongodb Native,我正在运行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); } };

我正在运行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
对象,然后重新运行请求。仅在第一次失败时才执行此操作。随后的故障将返回错误

我根本不喜欢我的解决方案。一定有更好的办法。有什么建议吗


谢谢。

您所说的“已经存在的db对象似乎记得无法建立连接”是什么意思?您的意思是,如果在运行mongod之前启动express应用程序,则对数据库的查询会失败吗?因为您是在express应用程序启动时连接到DB的,所以应该首先运行mongod

如果您担心数据库在初始连接后会崩溃并导致CRUD操作失败,那么可以检查操作中的错误

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

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

据我所知,mongodb本机驱动程序允许设置
{auto_reconnect:true}
,您尝试过设置吗


如果数据库根本没有运行,我不确定这会发生什么情况。例如,
mongoose.js
会缓存所有请求,直到数据库准备就绪,并在成功连接后发出请求。

“你的意思是,如果在运行mongod之前启动express应用程序,数据库查询会失败吗?”-没错。我知道我以前应该跑步。问题是我有时会忘记运行它,我希望能够在不重新启动服务器的情况下启动mongod。“然后在出现错误时重新连接”-这不是我已经在做的吗?正如我在问题中所说,我不喜欢我这样做并寻求更好的实施方式。您能提出一个建议吗?您能在初始连接中将autoreconnect设置为true吗?(因为mongojs是节点mongodb native的包装器)与节点mongodb native不同,mongojs将
auto_recect
设置为
true
。还是不起作用。也许这是mongojs中的一个bug。。。您尝试过使用原始节点mongodb本机api吗?这很有趣。但是,我找不到相关文件。介意提供一个链接吗?他们在哪里谈论自动重新连接?