Промежуточное ПО Fastify - доступ к запросу и параметрам?

пытаюсь заставить промежуточное ПО работать в Fastify - похоже, у меня нет доступа к запросу или параметрам. Документы говорят:

Fastify поддерживает готовое промежуточное ПО Express/Restify/Connect, это означает, что вы можете просто добавить свой старый код, и он заработает! (быстрее, кстати)

Но на простом примере:

fastify.use(function(req, res, next) {
  console.log('req.query', req.query);   // undefined
  console.log('req.params', req.params); // undefined
  next();
});

То же самое, если я добавлю/ограничу URL-адрес:

fastify.use('/foo', function(req, res, next) {

Я уверен, что что-то упускаю, но документы утверждают, что это «просто работает» — чего я не понимаю, как, если у вас нет доступа к qs?

[Я думаю, что могу переписать, чтобы использовать хуки, но мне действительно интересно, как я должен делать это с промежуточным программным обеспечением]

Спасибо


person Calv J    schedule 25.08.2019    source источник


Ответы (4)


На этот вопрос ответили, когда Fastify 2 была основной версией. Этот ответ может быть неверным для Fastify 3


Хотя Fastify совместим с сигнатурой метода Express/Restify, передаются не совсем те же значения. Сигнатура метода:

/**
 * Generic middleware method
 * @param {http.IncomingMessage} req
 * @param {http.ServerResponse} res
*/
const middleware = (req, res) => {
}

fastify.use(middleware)

При использовании .use Fastify только работает с HTTP-классы Node.js, которые не предоставляют поля .params или .query.

Express добавляет эти поля в качестве удобства для разработчиков. Если промежуточное ПО, которое вы используете, опирается на эти функции, к сожалению, это не будет прямым добавлением.

не все потеряно

Если вы решите перенести промежуточное ПО на Fastify, поля .params и .query будут доступны в Запросить объект.

Используя промежуточное программное обеспечение в вашем вопросе, вот как будет выглядеть версия Fastify.

fastify.addHook('onRequest', function(request, reply, done) {
  console.log('query', request.query);
  console.log('params', request.params);

  done();
})

Fastify просит разработчиков больше думать о хуках и меньше о промежуточном программном обеспечении. Это обеспечивает большую гибкость и большую скорость, но иногда может быть немного сложнее в написании.

Дополнительное чтение

Жизненный цикл и Hooks на сайте Fastify дает более подробную информацию о том, как эти части работают вместе.

В документация по промежуточному ПО содержит более подробную информацию о поддерживаемых функциях.

В некотором роде, используя плагины, вы возможность охвата определенного пути.

использованная литература

Экспресс-поддержка промежуточного ПО

Из документации по промежуточному ПО:

Кроме того, методы, добавленные Express и Restify в расширенные версии req и res, не поддерживаются промежуточным ПО Fastify.

а также

Express сильно изменяет прототип объектов запроса и ответа ядра узла, поэтому Fastify не может гарантировать полную совместимость промежуточного программного обеспечения.

Экспресс-добавление .params и .query

Экспресс-добавление .query в запрос и где Express запускает промежуточное ПО запроса

Экспресс-добавление параметров в маршрут.

person MattCan    schedule 18.11.2019

Функция .use() — это всего лишь утилита, помогающая пользователям перейти с Express на Fastify. Интерфейс функции ввода — (req, res, next), но объект req и res — это стандартные объекты Node.js https://nodejs.org/api/http.html#http_class_http_clientrequest и https://nodejs.org/api/http.html#http_class_http_serverresponse (тот же интерфейс промежуточного ПО Express) . Таким образом, предполагается, что пользователи реализовали промежуточное ПО для Express, используя стандартные объекты Node.js.

Чтобы заархивировать ваши потребности, вы должны проанализировать req.url как описан здесь. .use API будет объявлен устаревшим в Fastify v3.

Вместо этого, если вы хотите начать разработку с помощью Fastify, вам следует перейти на .register< /а>. Реестр — отличная функция Fastify, которая предлагает инкапсуляцию.

person Manuel Spigolon    schedule 27.08.2019

Метод использования I Fastify используется для регистрации промежуточного программного обеспечения. Промежуточное ПО — это функция со следующим промежуточным ПО подписи (err, req, res, next). Попробуйте:

fastify.use(function(err, req, res, next) {
    console.log('req.query', req.query);   // undefined
    console.log('req.params', req.params);
    next();
});
person dima golovin    schedule 25.08.2019
comment
Я не думаю, что это все ... запустите свой пример, и мало того, что оба они все еще не определены, вы также получите TypeError (следующий не является функцией). Если вы сохраните его, как мой пример, вы можете получить req.url или req .method - только не параметры или запрос - person Calv J; 25.08.2019
comment
Извините, что ввел вас в заблуждение. Use действительно используется для регистрации промежуточного программного обеспечения, но похоже, что промежуточное программное обеспечение Fastify должно быть такой функцией, как (fastify, options, next) => {}. Вы не можете использовать функцию «use» для регистрации маршрутов и доступа к объектам запросов и ответов. вы можете узнать больше здесь: fastify.io/docs/latest/Server/#use< /а> - person dima golovin; 25.08.2019
comment
Спасибо за ваш ответ - я до сих пор его не понимаю - не могли бы вы опубликовать обновление для моего простого fn выше, каким должно быть промежуточное программное обеспечение? Только мне это не заходка кажется, а рефакторинг? - person Calv J; 25.08.2019

Вы можете использовать fastify без метода .use, просто используйте fastify.route.

 fastify.route({
  method: 'GET',
  url: '/',
  schema: {
    // request needs to have a querystring with a `name` parameter
    querystring: {
      name: { type: 'string' }
    }
  },
  handler: async (request, reply) => {
 // here you will get request.query if your schema validate
  }
})
person Mohammad Khalid    schedule 17.10.2019