En mi controlador tengo este método que renderiza un archivo marko enviando un objeto a la vista con datos (dataView)
export const renderRecoveryData = ( req: Request | any, reply: ResponseToolkit, callback: any ): void => { const dataView: { [key: string]: any } = { id: 1, info: getInfo(req, reply, callback), }; templateEngine.renderFromTemplate( "./views/private/info/info.marko", dataView, req, reply, ); };En la propiedad "info" quiero cargar un objeto que obtenga los datos de la llamada a dos servicios, usando este método:
const getInfo = (req: Request | any, reply: any, callback: any): void => { const headers = helpers.setHeaders(req); const idNumber = req.yar.get('idNumber'); async.parallel({ personalData: (callback: any) => infoService.personalInfo(idNumber, headers, callback), addionalInfo: (callback: any) => infoService.addicionalInfo(headers, callback), }, (err: any, responses: any) => { if (err) { return callback(err); } console.log("response", responses); return responses; }); };El archivo console.log me muestra correctamente el objeto que quiero guardar en la propiedad "info" de "dataView", pero cuando compruebo lo que obtiene la vista, la propiedad "info" no aparece, solo me muestra el propiedad "id"
Llamo a "renderRecoveryData" desde un archivo de rutas:
server.route({ method: "GET", path: "/{locale}/private/info/dashboard/step1", handler: renderRecoveryData, });¿Cual puede ser el problema? Gracias
Veo 2 problemas en el código:
getInfo es una función asíncrona y no se agrega devolución de llamada/espera cuando se invoca en el controlador.getInfo .Cambiar el código a algo como a continuación debería funcionar:
export const renderRecoveryData = ( req: Request | any, reply: ResponseToolkit, callback: any ): void => { getInfo(req, reply, (err, info) => { if(err) { // Handle error } const dataView: { [key: string]: any } = { id: 1, info, }; templateEngine.renderFromTemplate( "./views/private/info/info.marko", dataView, req, reply, ); }); }; const getInfo = (req: Request | any, reply: any, callback: any): void => { const headers = helpers.setHeaders(req); const idNumber = req.yar.get('idNumber'); async.parallel({ personalData: (callback: any) => infoService.personalInfo(idNumber, headers, callback), addionalInfo: (callback: any) => infoService.addicionalInfo(headers, callback), }, (err: any, responses: any) => { if (err) { return callback(err); } console.log("response", responses); return callback(err, responses); }); };Creo que el problema es la forma en que devuelves la respuesta, creo que deberías pasar la respuesta a la devolución de llamada.
const getInfo = (req: Request | any, reply: any, callback: any): void => { const headers = helpers.setHeaders(req); const idNumber = req.yar.get("idNumber"); async.parallel( { personalData: (callback: any) => infoService.personalInfo(idNumber, headers, callback), addionalInfo: (callback: any) => infoService.addicionalInfo(headers, callback), }, callback // this is better ); };