fastify.route выполняет функцию дважды

Не могу понять почему функция выполняется 2 раза. Выложил всю функцию в которой происходит данная ошибка. Буду очень благодарен за помощь!

async function routes(fastify, options) {

    try {

        let dir = './controller'
        var getFiles = function (dir) {
            let apiFiles = fs.readdirSync(dir);
            for (let file in apiFiles) {
                let name = dir + '/' + apiFiles[file];
                if (fs.statSync(name).isDirectory()) {
                    getFiles(name, commandFiles);
                } else {
                    commandFiles.push(name);
                    const command = require(`${name}`);

                    let url = name
                        .replace('./controller/', "/")
                        .replace('.js', "")
                        .replace('index', "")
                        .replace(/\[/g, ":")
                        .replace(/\]/g, "")

                    fastify.route({
                        method: command.method,
                        url: url,
                        preHandler: async (request, reply, done) => {
                            await oauth.check(command, request, reply);
                            done()
                        },
                        handler: async (request, reply) => {
                            await command.execute(request, reply) // выполняется последовательно 2 раза
                        }
                    })

                    console.log(` dir: ${name} | url: ${url} | method: ${command.method}`)
                }
            }
        }
        getFiles(dir);
    } catch (err) {
        console.error(err);
    }
}

Ответы (1 шт):

Автор решения: Yugofx

Ваш контроллер /admin/account/reg падает на функции sha1 и попадает в catch блок контроллера. Поскольку catch никак не обрабатывает запрос, команда возвращает Promise -> undefined. Этот случай описан в доках Fastify.

Все, что вам надо, это вернуть какое-то значение из Promise. Например:

catch (err) {
    console.log(err);
    return response.badRequest('', "invalid", reply);
}

Также на повторный вызов влияет preHandler. Поскольку он асинхронный, плюс вы вызываете done(), тем самым не дожидаясь резолва preHandler. Поэтому первый раз он срабатывает именно на вызов done() а второй раз на Promise.resolve. Странно, что api это позволяет.

→ Ссылка