случайное некорректное поведение, а именно, если каталог для файла не существует, и я хочу создать его, каталог будет создан пустым без файла
Это может быть вызванонеправильными реализациями writeFilePromise
и особенно mkDirPromise
.fs.writeFile
и fs.mkdir
асинхронны, но обещание разрешается синхронно.Это должно быть:
function writeFilePromise(writePath, textContent) {
return new Promise((resolve, reject) => {
fs.writeFile(writePath, textContent, (err) => {
if (err)
reject(err);
else
resolve();
});
});
}
function mkDirPromise(dir) {
return new Promise(((resolve, reject) => {
fs.mkdir(path.join(constants.FILES_STORAGE_DIR, dir), (err) => {
if (err)
reject(err);
else
resolve();
});
}));
}
Вот для чего util.promisify
:
const writeFilePromise = util.promisify(fs.writeFile);
Даже в этом случае это переосмысление колеса, потому что уже есть сторонние пакеты, которые делают этои даже больше, а именно fs-extra
.
createFile
имеет слабый поток управления и использует многообещающую конструкцию antipattern.Поскольку он использует async..await
, он должен быть:
async function createFile(dir, fileName, httpMethod, textContent) {
const searchPath = path.join(ROOT_DIR, dir, fileName);
if (httpMethod === POST && fs.existsSync(searchPath)) {
throw new Error();
} else {
const fileExistsStatus = fs.existsSync(path.join(ROOT_DIR, dir));
if (!fileExistsStatus) {
await mkDirPromise(dir);
}
await writeFilePromise(searchPath, textContent);
}
}
Следует отметить, что existsSync
- это стабильный метод API, его можно использовать для проверки существования файла.Поскольку документация гласит,
Обратите внимание, что fs.exists () устарела, а fs.existsSync () - нет.(Параметр обратного вызова для fs.exists () принимает параметры, которые несовместимы с другими обратными вызовами Node.js. Fs.existsSync () не использует обратный вызов.)