Я работаю над методом post на стороне сервера, чтобы получить все файлы в запрошенном каталоге (не рекурсивно), и ниже приведен мой код.
У меня проблемы с отправкой ответа (res.json(pathContent);
) с обновленным pathContent
без использования setTimeout
.
Я понимаю, что это связано с асинхронным поведением используемых методов файловой системы (readdir
и stat
) и требует использования некоторого рода методов обратного вызова, асинхронного или обещания.
Я пытался использовать async.waterfall
со всем телом readdir
в качестве одной функции и res.json(pathContent)
в качестве другой, но он не отправлял обновленный массив на клиентскую сторону.
Я знаю, что были тысячи вопросов относительно этой асинхронной операции, но не мог понять, как решить мой случай после прочтения количества постов.
Любые комментарии приветствуются. Спасибо.
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);
});