Javascript变量分配未定义'在随后的声明中

时间:2017-03-18 11:50:36

标签: javascript variables undefined variable-assignment

我在一个由节点/快递应用程序提供服务的网页中嵌入了一个dropzone.js小部件。这一切都很有名,所以我添加了提供上传限制的条件。有三个这样的限制; mime类型(一个工作正常),上传的文件大小(也可以正常工作)和文件数量(不能正常工作)。

以下是代码中的代码段:

var fileSize = req.file.size;
if(fileSize > 200000) {
  return res.status(422).json({
    error: "File too large."
  });
}

var numfiles = fs_filecount(appwd+"data/free/req.session.freeFolderID");
if(numfiles>20) {
  return res.status(422).json({
    error: "Maximum file count reached."
  });
}

我提出这样的两个赋值和条件,因为这是它们出现在.js文件中的方式。文件大小的赋值和条件很有效,但文件计数的分配和条件不起作用。 fs_filecount函数的源代码如下:

fs_filecount = function(path) {
  fs.readdir(path,function(err, files){
    if(err){
      return console.error(err);
    } else {
      return files.length;
    }
  });
};

请注意,记录此文件计数函数返回的值会直接表明它正常工作。

失败的是,在分配numfiles之后,它是未定义的,因此文件计数测试总是失败,并且永远不会强制执行不超过20个文件的约束。

编辑:简化的子程序' fs_filecount'如下:

function fs_filecount(path) {
  var count;
  fs.readdir(path,function(err,files) {
    if(err) throw err;
    else {
      count = files.length;
    }
  });
  return count;
};

1 个答案:

答案 0 :(得分:1)

fs.readdir是一个异步函数,因此传递给readdir的回调在fs_filecount退出后被称为 ,因此您无法使用return语句从readdir返回fs_filecount的结果。

您需要使用Promise作为返回值或使用fs_filecount的回调。

基于Promise的解决方案看起来像这样

function fs_filecount(path) {
  return new Promise((resolve, reject) => {
    fs.readdir(path, (err, files) => {
      if (err) {
        reject(err)
      } else {
        resolve(files.length)
      }
    })
  })
}

以及如何使用它:

fs_filecount(appwd + "data/free/req.session.freeFolderID")
  .then(numfiles => {
    if (numfiles > 20) {
      return res.status(422).json({
        error: "Maximum file count reached."
      })
    }
  })
  .catch(err => {
    console.log('there was an error: ' + err)
  })

有关详细信息,请查看此问题:How do I return the response from an asynchronous call?