0

simple code:
in initdb.js

var mongo = require('mongodb'),
  MongoClient = mongo.MongoClient,
  MongoServer = mongo.Server;

var mongoClient = new MongoClient(new MongoServer('host',port));
var db = mongoClient.db('db');

mongoClient.open(function (err, mongoclient) {
  if (err) throw err;  
});

If this code throws error, it would not be caught here main.js

app.use(function(err, req, res, next){
  console.log('error here');
});

As a result I have errors and crashed app. I just want my app not crash. Any solutions?

4

1 回答 1

1

看起来initdb.js您的应用程序启动时运行一次,而不是每次请求。这是有道理的,您可能不希望每个请求都有新的数据库连接。

但是,app.use(function(...适用于处理请求的代码。它不会在您的应用程序启动时运行,它会在您收到的每个请求时运行。或者,在这种情况下,仅在这些请求引发错误时运行。(我假设你在这里使用 connect/express。)

因此,差异在于您的数据库连接代码在app.use()链外运行,并且很可能在第一个请求发生之前。

一般来说,如果您无法连接到数据库,那么快速失败并不是一个糟糕的选择,所以我会说您的代码是可以的。如果您希望服务器在没有数据库的情况下继续运行,init.js则从

if (err) throw err;

if (err) console.error('error connecting to database', err);

如果需要,您可以花哨并添加一些重试逻辑,但这应该足以防止您的应用程序立即崩溃。(您可能还必须更新应用程序的其他部分才能在没有数据库的情况下工作。)

于 2013-08-13T17:44:52.290 回答