【发布时间】:2017-08-09 23:38:30
【问题描述】:
我在 node/express 应用程序提供的网页中嵌入了一个 dropzone.js 小部件。这一切都很有名,所以我添加了提供上传约束的条件。有三个这样的约束; mime 类型(那个可以正常工作)、上传的文件大小(也可以正常工作)和文件数量(不能正常工作)。
这是代码中的一个 sn-p:
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是一个 asnyc 函数,因此您传递给readdir的回调在fs_filecount的退出之后调用,所以您不能使用return语句从fs_filecount返回readdir的结果。您要么需要使用 Promise 作为返回值,要么还需要使用fs_filecount的回调。
标签: javascript variables undefined variable-assignment