【发布时间】:2017-07-21 01:24:12
【问题描述】:
我正在尝试通过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);
})
【问题讨论】:
标签: javascript node.js asynchronous fs async.js