首页 > 解决方案 > 使用 mkdirsync 时节点中的异常

问题描述

我有一个代码。

    try{
        var Storage = multer.diskStorage({
            destination: function (req, file, callback) {
                fs.mkdirSync('/home/data/' + file.originalname, { recursive: true }, (error) => {
                    if (error) {
        } else {
                        alert('Directory created');
                        console.log('Your directory is made!');
                    } ........

}catch(e){
    console.log(e);
}

即使我有尝试捕获,当目录已经存在时,我的程序也会给出异常。我不明白为什么..节点崩溃并且没有处理。如果我遗漏了什么,你能告诉我吗

我得到的错误是

fs.js:885
  return binding.mkdir(pathModule._makeLong(path),
                 ^

Error: EEXIST: file already exists, mkdir '/home/data/dd_dd'
    at Object.fs.mkdirSync (fs.js:885:18)
    at DiskStorage.destination [as getDestination] (/home/server.js:16:7)
    at DiskStorage._handleFile (/home/nodejsapplication/node_modules/multer/storage/disk.js:31:8)
    at /home/node_modules/multer/lib/make-middleware.js:144:17
    at allowAll (/home/node_modules/multer/index.js:8:3)
    at wrappedFileFilter (/home/node_modules/multer/index.js:44:7)
    at Busboy.<anonymous> (/home/node_modules/multer/lib/make-middleware.js:114:7)
    at emitMany (events.js:147:13)
    at Busboy.emit (events.js:224:7)

标签: javascriptnode.js

解决方案


该错误在异步代码中引发(您的回调multer.diskStorage)。所以它不会被你的包装捕获try/catch (它只能捕获同步错误)

您还使用 的同步版本mkdir,即mkdirSync. 它不需要回调,因为它是同步的。

要么使用mkdir,它需要一个带有error参数的回调:

var Storage = multer.diskStorage({
    destination: function (req, file, callback) {
        fs.mkdir('/home/data/' + file.originalname, { recursive: true }, (error) => {
          if (error) {} else {
            console.log('Your directory is made!');
          }
        });
     // ...

或保留mkdirSync,并在其try/catch周围添加:

var Storage = multer.diskStorage({
    destination: function (req, file, callback) {
      try {
        fs.mkdirSync('/home/data/' + file.originalname, { recursive: true });
        console.log('Your directory is made!');
      } catch (e) {}
     // ...

推荐阅读