Ведение журнала Fastify response body
Как я могу зарегистрировать тело ответа в Fastify? Тело, кажется, не выставлено как часть объекта ответа:
const fastify = require('fastify')({
logger: {
serializers: {
res: function (res) {
// No body in req afaik
return { }
}
}
}
})
0 ответов
Попробуй это:
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();
});
Вот вам рабочий пример. Я думаю, что этот вид использования нужно использовать только для отладки, потому что вы замедляетесь, если у вас много запросов / сек.
Я также добавил валидацию JSON Schema в качестве демонстрации:
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)
Ты получишь:
{"это"}