Сделать все правильно с первого раза - это не только невозможно, но и странно.
В последние месяцы мы собрали ваши отзывы, проблемы и потребности и работали за кулисами, чтобы сформировать Fastify v2, чтобы решить все из них. .

Начиная с сегодняшнего дня, Fastify v2 будет выпущен как Release Candidate, так что вы можете попробовать его и сообщить нам, есть ли еще что-то, что мы должны исправить или улучшить, прежде чем выпускать окончательный выпуск. В течение периода RC мы также обновим все наши официальные плагины для поддержки в лучшем случае Fastify v2 и будем использовать новые функции для их улучшения. Вы можете установить его сейчас с помощью npm install fastify@next.

Говоря о новых функциях и критических изменениях, ниже вы можете найти список всех основных изменений, которые мы сделали, со ссылкой на их запрос на вытягивание, кратким описанием и примером кода.

Сообщите нам о любых проблемах с совместимостью и обновлением на странице https://github.com/fastify/help.

Добавлен хук onError # 1236

Добавьте новый обработчик приложения под названием onError, который разработчик может использовать для отслеживания всех ошибок, которые Fastify отправляет пользователю. Это может быть очень полезно также для отправки ошибок внешнему трассировщику или для поддержки решения APM (мониторинг производительности приложений).
В Fastify v1 мы не можем сделать это легко, потому что setErrorHandler может будет перезаписан, и хук onSend получит уже сериализованную полезную нагрузку.
В Fastify v1 нет способа получить объект ошибки и быть на 100% уверенным, что ваш код никогда не будет перезаписан.

fastify.addHook(‘onError’, (request, reply, error, next) => {
 // some code
 next()
})

Переместить все свойства с префиксом _ в символы в следующем # 1237 # 1128

Внутренние свойства fastify, которым предшествовал префикс _ в ключевых объектах, таких как запрос и ответ, теперь используют символы. Это обеспечивает более четкое разделение между внутренними компонентами и вашим приложением, четко определяя, какие свойства вы можете использовать.

Плагины теперь могут получать как / prefix, так и prefix / # 1228.

Возможность добавлять префиксы ко всем маршрутам, определенным в плагине, является ключевой особенностью Fastify. В версии 2 мы решили проблему, из-за которой невозможно было настроить маршрут как для /prefix, так и для /prefix/, следующим образом:

const fastify = require(‘fastify’)()
fastify.register(function (instance, options, next) {
  // the route will be called for both ‘/english/’ and ‘/english’
  instance.get(‘/’, (req, reply) => {
    reply.send({ greet: ‘hello’ })
  })
  next()
}, { prefix: ‘/english’ })
fastify.listen(8000, function (err, address) {
  if (err) throw err
  console.log(`server listening on ${address}`)
})

Обработчик ошибок по умолчанию, регистрирующий ошибку # 1135

В Fastify v1 мы регистрировали все ошибки независимо от того, был ли (или нет) собственный обработчик ошибок (через setErrorHandler()). В Fastify v2 это поведение было перенесено в обработчик ошибок. Это означает, что обработчик ошибок теперь отвечает за регистрацию самой ошибки.

fastify.setErrorHandler(function (error, request, reply) {
  request.log.warn(error) // this is needed now
  var statusCode = error.statusCode >= 400 ? error.statusCode : 500
  reply
    .code(statusCode)
    .type(‘text/plain’)
    .send(statusCode >= 500
            ? ‘Internal server error’
            : error.message
    )
})

Убедитесь, что в Reply # serialize используется настраиваемый сериализатор # 1163.

reply.serialize(payload) сериализует полезную нагрузку с помощью настраиваемого сериализатора, если он установлен.

Лучшее управление ошибками # 1168

Мы можем резюмировать эту новую функцию одним словом: стандартизация!
Начиная с Fastify v2 ошибки больше не будут генерироваться встроенными, но они будут экземплярами пользовательских классов ошибок.
Вы можете получить доступ к полному списку ошибок на странице require('fastify/errors').

Увеличил avvio до 6.0.0. №1201

Новая версия avvio удаляет экземпляр из хука onClose в качестве первого параметра.

fastify.addHook('onClose', (done) => {
  // some code
  done()
})

Добавлен хук preValidation # 1153

Этот перехватчик был необходим, потому что не было возможности запустить логику аутентификации до проверки, но после перехвата onRequest или промежуточного программного обеспечения. Бывают случаи, когда вы не хотите раскрывать свою логику проверки неаутентифицированным запросам, этот хук устраняет эту проблему.

fastify.addHook('preValidation', (request, reply, next) => {
  // some code
  next()
})

Измените basePath на префикс # 1183

Свойство basePath было заполнено параметром prefix при передаче в плагин. Теперь он был переименован в prefix, чтобы обеспечить более интуитивно понятный API. Использование basePath теперь не рекомендуется.

Раздельное ведение журнала и опции # 1164 # 1166

Из Fastify v2 вы должны создать пользовательский идентификатор запроса как параметр верхнего уровня в конфигурации Fastify, а не внутри конфигурации регистратора. Это все еще поддерживается, но Fastify регистрирует предупреждение. Опция будет удалена из Fastify v3.

Измените тайм-аут плагина по умолчанию на 10 секунд вместо 0 # 1145

У каждого плагина теперь есть 10 секунд для загрузки, иначе произойдет ошибка. Это решает давнюю проблему с фазой начальной загрузки Fastify: если вы забудете вызвать обратный вызов или выполнить обещание, это приведет к зависанию фазы загрузки без возможности ее легкой отладки.

Пино v5 # 1065

Теперь Fastify внутренне использует Pino v5 для лучшего и более производительного ведения журнала с нулевой стоимостью редактирования журнала. Проверьте это на https://www.nearform.com/blog/announcing-pino-v5-0-0/.

В качестве примера следующий фрагмент будет печатать все входящие заголовки, кроме authorization.

const fastify = require(‘fastify’)({
  logger: {
    stream: stream,
    redact: [‘req.headers.authorization’],
    level: ‘info’,
    serializers: {
      req(req) {
        return {
          method: req.method,
          url: req.url,
          headers: req.headers,
          hostname: req.hostname,
          remoteAddress: req.ip,
          remotePort: req.connection.remotePort
        }
      }
    }
  }
})

Обновлен Не найден хендлинг №1084

Если один из ваших маршрутов возвращает ошибку 404, Fastify v2 будет обрабатывать customErrorHandler, а не notFoundHandler. Вы по-прежнему можете направлять запросы в notFoundHandler через reply.callNotFound(). notFoundHandler будет использоваться только для генерируемых маршрутизатором сообщений 404.

Хуки: всегда используйте основные объекты Fastify # 1066

Это была долгожданная «функция», в Fastify v1 onRequest и onResponse имеют разные сигнатуры и объекты, что приводит к путанице и немного сложным внутренним компонентам.

В Fastify v2 мы исправили это, и теперь каждый хук будет отображать одну и ту же сигнатуру. Промежуточное ПО будет по-прежнему предоставлять основные объекты Node.js по умолчанию, чтобы обеспечить совместимость с промежуточным ПО Express. Если вы не используете промежуточное ПО Express, мы настоятельно рекомендуем использовать перехватчики Fastify.

fastify.addHook(‘onRequest’, function (request, reply, next) {
  // request and reply are the core Fastify objects
  next()
})
fastify.addHook(‘onResponse’, function (request, reply, next) {
  // request and reply are the core Fastify objects
  next()
})
fastify.use(function (req, res, next) {
  // req and res are the Node core objects
  next()
})

Удалите `req.id` в сериализаторе # 1032

В журналах больше нет свойства req.id, а только reqId (меньше дублирования, меньше места, больше скорость!).

Удален url.parse и добавлена ​​поддержка парсера пользовательской строки запроса # 1270

Поскольку url.parse не рекомендуется в Node.js v12, мы решили удалить его из кодовой базы и использовать вместо него основной querystring модуль Node.js. С этим изменением синтаксический анализ строки запроса стал в два раза быстрее, чем раньше!
Мы также представили новую опцию конфигурации (querystringParser) для изменения парсера строки запроса по умолчанию, если это необходимо.

Расширенная поддержка кроссплатформенных сборок и официальная поддержка пряжи # 1226

Благодаря расширенной поддержке конвейеров Azure наша CI более производительна, и мы можем своевременно тестировать кроссплатформенные (Linux / yarn и Windows / npm) с помощью одной настройки. Это также дает официальную поддержку пряжи для Node 8 и Node 10. Мы благодарим AppVeyor за поддержку в последний год тестирования Windows. Мы также пока сохраняем нашу интеграцию travis-ci для Linux / npm.

Благодарности

Более 1700 коммитов, более 90 релизов, более 450 форков, используемых в производстве более чем 8 компаниями, более 260 тысяч загрузок и 87 официально признанных плагинов.

Вся эта работа была бы невозможна без помощи нашей фантастической команды, которой мы благодарим за их упорный труд!
allevo, cemremengu, delvedor, evanshortiss , Lmammino, jsumners, mcollina, nwoltman, starptech, и trivikr.
Мы также хотим поблагодарить всех наших замечательных авторы, за все сообщения об ошибках, запросы на включение и за то, что поверили в наш проект!

Fastify v2 покрывается нашим циклом поддержки LTS, организованным следующим образом: не менее шести месяцев активной поддержки плюс шесть месяцев исправлений безопасности (после выпуска Fastify v3), в то время как Fastify v1 достигнет EOL 1 июня.

Удачного кодирования!

Команда Fastify