2017-03-18 37 views
0

我有一个dropzone.js小部件嵌入在由node/express应用程序提供的网页中。这一切都很有名,所以我添加了提供上传限制的条件。有三种这样的限制; MIME类型(一个工作正常),上传的文件大小(也工作正常)和文件数量(这不正常工作)。在随后的声明中,Javascript变量是'undefined'

下面是代码片段:

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; 
}; 
+0

'FS。 readdir是一个_asnyc_函数,所以你传给'readdir'的回调函数在'fs_filecount'出口之后调用**,所以你不能使用'return'语句来返回'readdir'的结果m'fs_filecount'。您或者需要使用Promise作为返回值,或者使用'fs_filecount'回调。 –

回答

1

fs.readdir是一个异步功能,所以你传递给readdir回调后调用fs_filecount出口,所以你不能使用return语句从fs_filecount返回readdir的结果。

您或者需要使用Promise作为返回值或使用fs_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) 
    }) 

有关详情,请看一看这个问题:How do I return the response from an asynchronous call?

+0

你在我面前。让我在手机上编写代码的权利!只有当我在PC上发现它是一个异步函数并返回时才会切断它。 –

+1

@ConorGallagher如果一个函数需要回调,并且回调的一个参数(通常是第一个参数)是错误,那么您总是必须假定它是异步的,因为同步函数可能会抛出错误而不是将它传递给回调。 –