【发布时间】:2019-05-31 09:37:03
【问题描述】:
我正在使用服务器端的 post 方法来检索请求目录中的所有文件(非递归),下面是我的代码。
在不使用 setTimeout 的情况下,我无法使用更新的 pathContent 发回回复 (res.json(pathContent);)。
我了解这是由于所使用的文件系统方法(readdir 和 stat)的异步行为造成的,因此需要使用某种回调、异步或承诺技术。
我尝试将async.waterfall 与readdir 的整个主体一起用作一个函数,将res.json(pathContent) 作为另一个函数,但它没有将更新后的数组发送到客户端。
我知道关于这个异步操作有成千上万个问题,但在阅读了许多帖子后,我不知道如何解决我的问题。
任何 cmets 将不胜感激。谢谢。
const express = require('express');
const bodyParser = require('body-parser');
const fs = require('fs');
const path = require('path');
var pathName = '';
const pathContent = [];
app.post('/api/files', (req, res) => {
const newPath = req.body.path;
fs.readdir(newPath, (err, files) => {
if (err) {
res.status(422).json({ message: `${err}` });
return;
}
// set the pathName and empty pathContent
pathName = newPath;
pathContent.length = 0;
// iterate each file
const absPath = path.resolve(pathName);
files.forEach(file => {
// get file info and store in pathContent
fs.stat(absPath + '/' + file, (err, stats) => {
if (err) {
console.log(`${err}`);
return;
}
if (stats.isFile()) {
pathContent.push({
path: pathName,
name: file.substring(0, file.lastIndexOf('.')),
type: file.substring(file.lastIndexOf('.') + 1).concat(' File'),
})
} else if (stats.isDirectory()) {
pathContent.push({
path: pathName,
name: file,
type: 'Directory',
});
}
});
});
});
setTimeout(() => { res.json(pathContent); }, 100);
});
【问题讨论】:
-
看看这个帖子,貌似他们用的是同步方法stackoverflow.com/questions/44019316/…
-
感谢您的快速回复!根据参考资料,我使用了同步方法(readdirSync 和 statSync)并让它工作。
标签: javascript node.js express asynchronous