在nodejs中异步创建文件夹

时间:2018-01-04 15:18:15

标签: node.js asynchronous

我尝试制作一个简单的脚本,如果它不存在则创建一个文件夹。我读了一些文章并制作了这样的逻辑:

debug("before async");
(async () => {
  if(!fs.existsSync(outputPath)){
    debug("Folder not exsists! path: "+outputPath)
    try{
      return await fs.mkdir(outputPath)
    }catch(err){
      debug(err)
    }
  }
  res.send('<h1>Hello world!</h1>')
})()

我收到了一个错误:

(node:27611) [DEP0013] DeprecationWarning: Calling an asynchronous function without callback is deprecated.

确定。我想了一下,并提醒来自stackoverflow的那个人告诉我将回调功能作为promisify。我试着去做:

const mkdir = util.promisify(fs.mkdir);
debug("Before async");
(async () => {
  if(!fs.existsSync(outputPath)){
    debug("Folder not exsists! path: "+outputPath)
    await Promise.all(mkdir(outputPath))
  }
  res.send('<h1>Hello world!</h1>')
})()

但我还有其他错误:

UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 3): TypeError: undefined is not a function

我该怎么做?如果你知道任何可以帮助我理解异步功能的指南 - 这将是很棒的。谢谢!

btw,双向文件夹已创建。但有错误......

4 个答案:

答案 0 :(得分:2)

节点11.x.x及更高版本

await fs.promises.mkdir( '/path/mydir' );

答案 1 :(得分:1)

你不能/不需要使用Promise.all因为你只处理一个承诺,只是做

await mkdir(outputPath)

除此之外,你真的应该为你的代码添加一些错误处理。

答案 2 :(得分:1)

Promise.all用于运行一系列承诺。在您的情况下,您可以这样做:

await mkdir(outputPath)

根据您的需要,您可能会执行以下操作:

await Promise.all([mkdir(path1), mkdir(path2), mkdir(path3)])

我建议在跳转到异步/等待之前熟悉回调和承诺。

答案 3 :(得分:0)

异步检查文件夹是否存在,如果不存在则创建一个。从Node.js ^ 10.20.1开始工作。

const fsPromises = require("fs").promises;

async function createDir(dir) {
  try {
    await fsPromises.access(dir, fs.constants.F_OK);
  } catch (e) {
    await fsPromises.mkdir(dir);
  }
}