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

标签 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);
    }
  };
}

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/

相关文章:

javascript - 微型 Javascript 俄罗斯方 block

javascript - 如何直接在 HTML 页面中拍照(而不打开相机应用程序)?

node.js - 初学者 - 在 Windows 7 上使用 XAMPP 为 Angular 应用程序设置 localhost

MongoDB 编辑数组中的对象(如果存在) - 否则推送一个新对象

javascript - jquery 自动完成 |它出什么问题了

javascript - 如何使快速新闻栏逐字符阅读

javascript - Node JS 判断字符串中的某个单词是否在数组中

node.js - 如何实现网站客户端Twitter登录?

javascript - MongoDB:从用户文档中删除技能

javascript - Nodejs提交表单后出错