Логирование тела ответа Fastify

Как я могу записывать тело ответа в Fastify? Тело, похоже, не отображается как часть объекта ответа:

const fastify = require('fastify')({
  logger: {
    serializers: {
      res: function (res) { 
        // No body in req afaik
        return {  } 
      }
    }
  }
})

person cyberwombat    schedule 24.05.2018    source источник
comment
где вы можете найти решение?   -  person Woppi    schedule 28.07.2018
comment
Это было давно, поэтому я не могу точно вспомнить, но в моем текущем коде его нет.   -  person cyberwombat    schedule 04.08.2018
comment
благодарю вас. Возможно, это сделано намеренно, так как запись тела ответа в журнал может повлиять на производительность. Источник: github.com/pinojs/pino/issues/465#issuecomment-408642671< /а>   -  person Woppi    schedule 04.08.2018


Ответы (2)


Попробуй это:

const fastify = require('fastify')({
  logger: {
    serializers: {
      res: function (res) {
        return {
          statusCode: res.statusCode,
          payload: res.payload,
        }
      },
    }
  }
})

fastify.addHook('onSend', function (_request, reply, payload, next) {
  Object.assign(reply.res, { payload });
  next();
})

Если некоторые из ваших полезных нагрузок являются объектами, и вы хотите, чтобы они были сериализованы до того, как они будут сериализованы, вы также можете добавить хук preSerialization:

fastify
  .addHook('preSerialization', (_request, reply, payload, next) => {
    Object.assign(reply.res, { payload });
    next();
  })
  .addHook('onSend', (_request, reply, payload, next) => {
    if (!reply.res.payload) Object.assign(reply.res, { payload });
    next();
  });
person dols3m    schedule 24.05.2019

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

Я также добавил проверку схемы JSON в качестве демонстрации:

const fastify = require('fastify')({ logger: true })

fastify.register(async function (fastify, opts) {
  fastify.addHook('onSend', function (request, reply, payload, next) {
    console.log(payload);
    next()
  })

  fastify.get('/', {
    schema: {
      response: {
        '2xx': { properties: { this: { type: 'string' } } }
      }
    }
  }, async function () {
    return { this: 'is', a: 'json' }
  })
})

fastify.listen(3000)

Ты получишь:

curl http://localhost:3000/

{"Это"}

person Manuel Spigolon    schedule 11.02.2019