Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 节点最佳实践:在构造函数中抛出异步错误_Javascript_Node.js_Mocha.js - Fatal编程技术网

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

Javascript 节点最佳实践:在构造函数中抛出异步错误,javascript,node.js,mocha.js,Javascript,Node.js,Mocha.js,我正在使用Node,我有一个“类”,它将目录作为参数。它尝试创建该目录,如果失败,则抛出错误: function Config(dir) { fs.mkdir(dir, function(err) { if(err) throw new Error('Error', err); } } 我的问题是,这是一种被认可的方式吗?如果我要使用回调,那么我的程序的其余部分就必须驻留在回调中,这对我来说很奇怪 当我尝试使用mocha编写测试时,这个问题就表现出来了,因为异常是在异步调用中引

我正在使用Node,我有一个“类”,它将目录作为参数。它尝试创建该目录,如果失败,则抛出错误:

function Config(dir) {
  fs.mkdir(dir, function(err) {
    if(err) throw new Error('Error', err);
  }
}
我的问题是,这是一种被认可的方式吗?如果我要使用回调,那么我的程序的其余部分就必须驻留在回调中,这对我来说很奇怪

当我尝试使用mocha编写测试时,这个问题就表现出来了,因为异常是在异步调用中引发的,所以它无法工作:

it('should throw an error on a bad directory', function() {
  var fn = function() {
    var badConfig = new Config('/asdf');
  };
  assert.throws(fn, Error);
});
我已经调查了域,作为解决单元测试问题的一种方法,但这似乎并没有解决我的问题(或者我没有正确地实现它们)


最后,我正在寻找一种最佳实践,它允许我向应用程序指出发生了不好的事情,并允许我为该解决方案创建测试。

在这种情况下,听起来您可能真的想要进行同步调用(例如,应用程序的其余部分取决于在继续之前完成的调用)。因此,尽管这通常不是您想要构建节点应用程序的方式,但您可以使用同步版本mkdirSync()


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

您有三种可能:

  • 使用同步调用。正如AsolBerg所解释的,您的案例正好适合某些fs函数具有同步等效项的原因。这没关系,因为在您的情况下,所有应用程序都依赖于要加载的一个配置实例。但也有一些案例

  • 使用回调函数作为构造函数参数

  • 如果构造函数回调对您来说太奇怪,请将初始化代码放入一个接受回调的
    init()
    方法中。这是个人偏好的问题,但要使用这种技术


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

    应该避免异步抛出错误,因为它们不容易被捕获。您将需要使用回调,是的。也许还可以看看我在构造函数中使用异步操作时建议的模式是反模式。这是一个完整的答案,感谢您列出了几个备选方案。我确实在我的程序的其他地方使用了Q,但是由于如果创建这个对象失败,程序就不应该继续,所以我选择了同步路径。
    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;
        }
      }
    });