Estoy creando una API con HapiJS, usando TDD recibo un error porque la prueba valida el payload de la solicitud, curiosamente recibo una cadena en lugar de un objeto como dice la documentación.
Esta es mi prueba escrita con @hapi/lab:
it('payload should be a json object', async () => { const res = await server.inject({ method: 'GET', url: '/users' }) console.log(res) expect(res.payload).to.be.object() })y esta es mi ruta:
server.route({ method: 'GET', path: '/users', handler: (request, h) => { const data = { message: 'App' } const response = h .response(data) .type('application/json') .header('content-type', 'application/json') .code(200) return response } })Por cierto, ese console.log en la prueba es para confirmar el contenido de la carga res.payload y verificar que estaba recibiendo una cadena en lugar de un objeto.
Este es el error específico que recibo de la prueba: Expected '{"message":"App"}' to be an object but got 'string'
La propiedad que está buscando es el result del objeto de response que obtiene del método de inject .
la payload son los datos del punto final que hapi enviaría al cliente, lo que significa que se serializó. Esa es la razón por la que obtienes una cadena. En cambio, la propiedad de result son los datos sin procesar devueltos desde el punto final antes de la serialización. Puede encontrar más información en la documentación en el apartado de return .
Aquí hay un fragmento de código para mostrar esto:
const Hapi = require("@hapi/hapi"); const server = Hapi.Server(); server.route({ method: "GET", path: "/test", options: { handler(req, h) { return { result: 1 }; }, }, }); (async function () { await server.start(); console.log("server started"); const res = await server.inject({ method: "GET", url: "/test", }); console.log(res.payload); // ==> '{"result": 1}' console.log(res.result); // ==> { result: 1 } })(); Además, para responder a uno de los comentarios que hizo, en realidad ya envió un objeto desde su servidor hapi . Es solo que los datos fueron serializados. Necesitaría deserializarlo en cualquier contexto en el que llamaría a su punto final, con JSON.parse() por ejemplo, antes de poder usarlo.