【问题标题】:How to run a function in a fs.stat callback如何在 fs.stat 回调中运行函数
【发布时间】:2017-12-30 09:18:17
【问题描述】:

我使用 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'
  })

});

【问题讨论】:

  • 这个答案有用吗? stackoverflow.com/questions/11659054/…
  • file 变量从何而来?为什么创建文件夹后返回,您不想在创建文件夹后处理图像?缺少某些代码,这是在路由器处理程序中吗?
  • @MiguelLattuada file 来自我在此函数之外的变量var file = req.files,我在创建文件夹后返回uploader.image,因为这是我的问题,我不知道在哪里把它说成是回调可以调用该函数。我唯一缺少的代码是 uploader.image 的代码,我认为我不需要添加我的问题是在 fs.stat 回调

标签: javascript node.js callback fs


【解决方案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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-25
    • 1970-01-01
    • 2021-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多