如何在fs.stat回调中运行函数

时间:2017-07-24 17:19:30

标签: javascript node.js callback fs

我使用npm papercut https://www.npmjs.com/package/papercut进行图片上传,这是保存图像的功能(效果很好)。

uploader.process('image1', file.path, function(images){
  console.log(images.avatar); // '/images/uploads/image1-avatar.jpg'
  console.log(images.small); // '/images/uploads/image1-small.jpg'
})

我正在使用文件系统模块方法fs.stat,我想创建一个目录,我希望uploader.processfs.stat回调中运行。因此,保存的图像会进入fs.stat创建的目录。这是我到目前为止的代码,我不知道在哪里放置uploader.process函数,所以回调调用它。

fs.stat(`${tenantId}/`, function (err, stats){
  if (err) {
    // Directory doesn't exist or something.
    console.log('Folder doesn\'t exist, so I made the folder ' + `${tenantId}/`);
    return fs.mkdir(`assets/${tenantId}`, callback);
  }
  uploader.process('image1', file.path, function(images){
   console.log(images.avatar); // '/images/uploads/image1-avatar.jpg'
   console.log(images.small); // '/images/uploads/image1-small.jpg'
  })

});

1 个答案:

答案 0 :(得分:1)

您有两种选择,让您的呼叫同步。或者使用承诺。 (也许你有其他选择,但我希望这会有所帮助)。

// Synchronous way

// Check for node docs: https://nodejs.org/api/fs.html#fs_fs_statsync_path
const stats = fs.statSync(`${tenantId}/`);

// Check for stats class def: https://nodejs.org/api/fs.html#fs_class_fs_stats
if (!stats.isDirectory()) {
  // Node docs: https://nodejs.org/api/fs.html#fs_fs_mkdirsync_path_mode
  fs.mkdirSync(`assets/${tenantId}`);
}

uploader.process('image1', file.path, function(images){
   console.log(images.avatar); // '/images/uploads/image1-avatar.jpg'
   console.log(images.small); // '/images/uploads/image1-small.jpg'
});

// Async way

fs.stat(`${tenantId}/`, (err, stats) => {
  const localPromise = new Promise((resolve, reject) => {
    if (err) {
      fs.mkdir(`assets/${tenantId}`, () => { resolve(true) });
    }
    resolve(true);
  });
  
  localPromise.then(result => {
    uploader.process('image1', file.path, function(images){
     console.log(images.avatar); // '/images/uploads/image1-avatar.jpg'
     console.log(images.small); // '/images/uploads/image1-small.jpg'
  });
  });
});

检查文档,可能你应该在两种情况下尝试/捕获mkdir async / sync。