Почему функция в node.js возвращает undefined?

только начинаю изучать node и асинхронность, пишу функцию, которая рекурсивно поищет файл package.json и вернет путь, где она его найдет.
function getRoot(startPath) {
        let isRoot = false;
        if (isRoot) {
            return startPath
        }

        fs.access(`${startPath}/package.json`, fs.constants.F_OK, (err) => {
            if (!err) {
                isRoot = true;
            } else {
                const arr = startPath.split('/');
                arr.pop();
                const newRoot = arr.join('/');
                return getRoot(newRoot);
            }
        })
    }
    console.log(getRoot(process.env.PWD));


Мне возвращается undefined, хотя если поконсолись, то функция вызывается каждый раз с ожидаемым startPath и останавливается как надо. Не пойму, где что не так?
  • Вопрос задан
  • 678 просмотров
Решения вопроса 2
@StockholmSyndrome
попробуйте так:
async function getRoot(startPath) {
    return new Promise(async (resolve, reject) => {
        fs.access(`${startPath}/package.json`, fs.constants.F_OK, (err) => {
            if (!err) {
                resolve(startPath);
            } else {
                const arr = startPath.split('/');
                arr.pop();
                const newRoot = arr.join('/');
                resolve(await (getRoot(newRoot)));
            }
        });
    });
}
getRoot(process.env.PWD).then((data) => console.log(data));
Ответ написан
Комментировать
mmmaaak
@mmmaaak
Ты ничего не возвращаешь из своей функции, поэтому она возвращает undefined, тот return где рекурсивно вызывается функция, относится к колбэку, который передается в fs.access, как исправить? Нельзя просто так синхронно вернуть данные из асинхронной функции, можно вернуть промис, и подписаться на его resolve, или пробросить колбэку внутрь, который нужно будет дергать по окончанию работы
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы