我想通過fs
調用一個空文件夾的http請求。我們假設沒有子文件夾。因爲forEach
不是異步的,我選擇使用async
的each
而不是forEach
。代碼如下:通過異步解除文件夾的鏈接速度非常慢
後端:
router.post('/emptyDir', function (req, res, next) {
console.log("router.post /emptyDir");
var dir = req.body.dir;
var fs = require('fs');
var async = require('async');
fs.readdir(dir, function (err, files) {
if (err) return console.log(err);
console.log(JSON.stringify(files));
async.each(files, function (file) {
fs.unlink(dir + file, function (err) {
if (err) return console.log(err);
console.log(dir + file + " is removed");
})
}, function (err) {
if (err) return console.log('A file failed to be removed');
console.log('All files have been successfully removed');
return res.json(dir);
})
});
});
前端:
this.rewriteAllFiles = function (files) {
return $http.post('/emptyDir', { dir: prefix + idP + "/" })
.then(function (res) {
console.log("emptyDir finished");
...
我運行測試與包含2個文件的文件夾。它首先顯示沒有在瀏覽器日誌和以下日誌在後端:
router.post /emptyDir
["index.html","script.js"]
public/tmp/BGMTbU0RbeHdLAMjAAAD/index.html is removed
public/tmp/BGMTbU0RbeHdLAMjAAAD/script.js is removed
然後2分鐘後,它顯示在瀏覽器日誌emptyDir finished
,並在後臺顯示再次router.post /emptyDir
:
router.post /emptyDir
[]
All files have been successfully removed
我不明白爲什麼/emptyDir
叫兩次,爲什麼需要這麼長...
因此,沒有人知道哪裏錯了?
編輯1:我意識到使用Array.forEach
至少可以用於我的測試。但我不確定它是否是邏輯上正確。在files.forEach
的塊已完成之前,以下函數是否可以返回?
router.post('/writeFiles', function (req, res, next) {
console.log("router.post writeFiles");
var dir = req.body.dir, files = req.body.files;
var fs = require('fs');
files.forEach(function (file) {
fs.writeFile(dir + file.name, file.body, function (err) {
if (err) return console.log(err);
console.log(dir + file.name + " is written");
})
});
console.log("All files have been successfully written");
return res.json(dir);
})
它的工作原理,謝謝... – SoftTimur