节点最佳实践:在构造函数中抛出asynchronous错误

我正在与节点工作,我有一个“类”,将目录作为参数。 它试图创build该目录,如果失败,则会抛出一个错误:

function Config(dir) { fs.mkdir(dir, function(err) { if(err) throw new Error('Error', err); } } 

我的问题是,这是一个批准的方式吗? 如果我要使用callback,那么我的程序的其余部分将不得不驻留在callback中,这对我来说似乎很奇怪。

这个问题performance出来,当我试图用摩卡写一个testing,因为在asynchronous调用引发exception,将无法正常工作:

 it('should throw an error on a bad directory', function() { var fn = function() { var badConfig = new Config('/asdf'); }; assert.throws(fn, Error); }); 

我已经调查域作为解决unit testing问题的一种方式,但是这似乎并没有解决我的问题(或者我没有正确实施)。

 var d = domain.create().on('error', function(err) { throw err; } d.run(function() { function Config(dir) { fs.mkdir(dir, function(err) { if(err) throw err; } } }); 

最终,我正在寻找一个最佳实践,允许我向应用程序指出发生了一些不好的事情,并允许我为该解决scheme创buildtesting。

你有三种可能性:

  1. 使用同步呼叫。 AsolBerg解释说,你的情况正是为什么一些fs函数具有同步的等价性。 没关系,因为在你的情况下,你所有的应用程序依赖于一个Config实例的加载。 但有一些情况

  2. 使用callback作为构造函数参数。

  3. 如果构造函数callback对你来说真的太奇怪了,把你的初始化代码放到一个init()方法中,该方法需要一个callback函数。 这是个人喜好的问题,而是使用这种技术。

最后一个选项,你可以在init()方法中返回Future。 在NodeJS中有几个未来的库,这是callback参数的优雅替代品。 但是你不能在你的构造函数中使用它,因为构造函数的返回值是创build的对象。

这听起来就像在这种情况下你可能实际上想要进行一个同步的调用(例如,你的应用程序的其余部分取决于这个调用在继续之前完成)。 因此,虽然通常不会考虑构build节点应用程序,但可以使用同步版本mkdirSync()。

http://nodejs.org/api/fs.html#fs_fs_mkdirsync_path_mode

然后,如果调用失败,你可以捕获错误,并返回它(可能)退出应用程序。