Javascript 节点最佳实践:在构造函数中抛出异步错误
我正在使用Node,我有一个“类”,它将目录作为参数。它尝试创建该目录,如果失败,则抛出错误: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编写测试时,这个问题就表现出来了,因为异常是在异步调用中引
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()
然后,如果呼叫失败,您可以捕获错误并返回,然后(可能)退出应用程序。您有三种可能:
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;
}
}
});