ReadFile возвращает неопределенный результат

#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 этого не делают.