Javascript变量赋值为';未定义';在随后的声明中

Javascript变量赋值为';未定义';在随后的声明中,javascript,variables,undefined,variable-assignment,Javascript,Variables,Undefined,Variable Assignment,我有一个dropzone.js小部件嵌入到一个由node/express应用程序提供服务的网页中。这一切都非常有效,所以我加入了提供上传约束的条件。有三个这样的限制;mime类型(可以正常工作)、上载的文件大小(也可以正常工作)和文件数(不能正常工作) 下面是代码的一个片段: var fileSize = req.file.size; if(fileSize > 200000) { return res.status(422).json({ error: "File too l

我有一个dropzone.js小部件嵌入到一个由node/express应用程序提供服务的网页中。这一切都非常有效,所以我加入了提供上传约束的条件。有三个这样的限制;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;
};

fs.readdir
是一个异步函数,因此传递给
readdir
的回调在退出
fs\u filecount
后调用,因此不能使用return语句从
fs\u filecount
返回
readdir
的结果

您需要使用承诺作为返回值,或者对
fs\u filecount
使用回调

基于承诺的解决方案应该是这样的

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)
  })

有关更多详细信息,请查看此问题:

fs.readdir
是一个asnyc函数,因此在退出
fs\u filecount
后调用传递给
readdir
的回调,因此不能使用
return
语句从
fs\u filecount
返回
readdir
的结果。您要么需要使用承诺作为返回值,要么还需要对
fs\u filecount
进行回调。我在手机上写代码真是活该!只有在我上了电脑后才发现它是一个asyn函数,返回值并不能阻止它。@ConorGallagher如果一个函数接受回调,并且回调的一个(通常是第一个)参数是错误的,那么你必须始终假设它是异步的,因为同步函数可以抛出错误,而不是将其传递给回调。