我使用的是节点4.5+和蓝鸟。我打算使用以下代码then
:
var checkdir = function(directory) {
return new Promise(function(resolve, reject) {
fs.statAsync(directory).then(function() {
resolve(true);
}).catch(function(err) {
if(err.code === 'ENOENT') {
fs.mkdirAsync(directory).then(function() {
resolve(true);
}).catch(function() {
reject(new Error('Can not create folder'));
});
} else {
reject(new Error('Unknown fs stat error: ' + err));
}
});
});
};
Async
函数来自fs-extra-promise
模块。但是,当我尝试使用此功能时,我得到Unhandled rejection Error: Unknown error: TypeError: Cannot read property 'then' of undefined
。
通话:
checkdir(dir).then(function() {
...
}).catch(function(err) {
reject(new Error('Unknown error: ' + err));
});
这里有什么问题?
答案 0 :(得分:3)
使用任何类型的"存在"在节点文档中检入文件系统操作是actively discouraged。 (无论您使用stat
还是使用exists
进行存在检查都无关紧要。)
这意味着,除了Benjamin Gruenbaum关于代码中the improper use of promises in general的评论之外,还有另一个要点:
创建目录的正确方法是无条件调用mkdir
并忽略EEXIST
(比较this answer以获取更多上下文)。
var fs = Promise.promisifyAll(fs);
var ensureDir = function ensureDir(path) {
return fs.mkdirAsync(path).catch((err) => { if (err.code !== 'EEXIST') throw err; });
}
您可以使用the mkdirp
module递归创建路径,例如mkdir -p
。