#javascript #node.js #async-await #readfile
#javascript #node.js #асинхронный-ожидание #readfile
Вопрос:
У меня такая ситуация, когда я пытаюсь отправить запрос с содержимым файла, но проблема в том, что содержимое поступает неопределенным. Как я могу это решить? Я пробовал несколько версий из stackoverflow, но пока ничего не получалось.
const ifExists = (filePath) => {
try {
if (fs.existsSync(filePath)) {
return true;
}
} catch (err) {
console.log(err);
}
return false;
}
const readMyFile = async (filePath) => {
const fileExists = ifExists(filePath);
if (fileExists) {
fs.readFile(filePath, (err, data) => {
if (err) {
console.log("Error occurred when trying to read the file.");
return false;
}
console.log("File successfully read.");
return data; // data has the right content here
});
} else {
console.log("File not found");
return false;
}
}
const getFile = async function (req, res, next) {
try {
const content = await readMyFile(filePath); // the content is undefined here
res.writeHead(200, { "Content-Type": "application/json" });
res.write(JSON.stringify(content));
} catch (err) {
console.log("Error occurred.");
res.status(500).send("Error");
} finally {
res.end();
}
};
Спасибо, что уделили мне время!
Ответ №1:
fs.readFile
использует обратный вызов и не возвращает обещание, что означает, что его нельзя правильно использовать в асинхронной функции. Если вы хотите использовать асинхронную функцию, я предлагаю вернуть обещание.
const readFile = async (filePath) => {
return new Promise((resolve, reject) => {
if (!exists(filePath)) {
reject(Error("File not found"));
}
fs.readFile(filePath, (err, data) => {
if (err) {
reject(err);
}
resolve(data)
});
})
}
Комментарии:
1. обратите внимание, что я переименовал ваш ifExists в exists для удобства чтения, поскольку он должен вызываться внутри оператора if
2. Спасибо за ваш ответ. Но я не могу понять, почему это работает (tbh, с которым я не работаю
Promises
), и что не так сasync/await
синтаксисом? Я имею в виду, можно ли это записать с помощьюasync/await
вместоPromise
? Что я там сделал не так?3. О, я думаю, я понял, что для использования
async/await
мне нужны методы, которые возвращают обещания, аreadFile
этого не делают.