Как загрузить среду fastify-env синхронно?

Я работаю над микросервисом fastify и хотел бы использовать библиотеку fastify-env для проверки моих входных данных env и обеспечения значений по умолчанию для всего приложения.

const fastify = require('fastify')()
fastify.register(require('fastify-env'), {
  schema: {
    type: 'object',
    properties: {
      PORT: { type: 'string', default: 3000 }
    }
  }
})
console.log(fastify.config) // undefined

const start = async opts => {
  try {
    console.log('config', fastify.config) // config undefined
    await fastify.listen(3000, '::')
    console.log('after', fastify.config)  // after { PORT: '3000' }

  } catch (err) {
    fastify.log.error(err)
    process.exit(1)
  }
}

start()

Как я могу использовать fastify.config объект до запуска сервера?

3 ответа

Использовать ready() https://www.fastify.io/docs/latest/Server/, чтобы дождаться загрузки всех плагинов. Тогда позвониlisten() с вашей переменной конфигурации.

try {
    await fastify.ready(); // will load all plugins
    await fastify.listen(...);
} catch (err) {
    fastify.log.error(err);
    process.exit(1);
}

Концепция Fastify построена так, как будто вы добавляете зависимости через реестр. И тогда все будет загружено, когда мы запустим экземпляр fastify с помощью метода Ready или прослушаем : https://fastify.dev/docs/latest/Reference/Server/#ready

      async function bootstrap() {
   // ------- Compile time in fastify lifecycle ----------
   const serverInstance = require('fastify')();

   serverInstance.register(envPlugin); // Register but not run the plugin at this moment.

   console.log(serverInstance.config); // When you try to access config, there is no config added into fastify container
   // ------- End Compile time in fastify lifecycle----------

   // ------- Run time -> Loading plugins ----------
   try {
     await serverInstance.ready(); // This will wait all the plugins loaded into fastify container

     console.log(serverInstance.config); // Now everything is loaded, log will contains values
   }
}

bootstrap();

fastify.register загружает плагины асинхронно AFAIK. Если вы хотите сразу использовать вещи из определенного плагина, используйте:

fastify
    .register(plugin)
    .after(() => {
        // This particular plugin is ready!
    });
Другие вопросы по тегам