Estoy tratando de implementar alguna función básica de orden superior que devolvería una nueva función con la función provista rodeada con el bloque try catch. Algo como esto:
function wrapLogging(f) { return async (...args) => { try { await f(...args); } catch (e) { log(e); }; } } // dummy example: const executeAndLog = wrapLogging(executeFunction); executeAndLog(); // nestjs controller and service example: @Post('/create') async executeAndLog() { const executeAndLog = wrapLogging(this.exampleService.create); await executeAndLog(); }Ahora el problema es que obtengo errores indefinidos al proporcionar this.exampleService.create. "Error de tipo: no se pueden leer las propiedades de undefined..." Entiendo que falta el contexto, pero no sé cómo 'conectarlo'. Intenté buscar ejemplos en Google y encontré un problema similar con las soluciones .call o .apply, pero no funcionó en este caso. ¿Quizás se deba a que el método de servicio proporcionado es asíncrono o tiene algo que ver con los servicios de nestjs y su contexto?
¡Cualquier ayuda es muy apreciada! ty
Para usar un enfoque como este, debe reconocer que el léxico this se pierde al usar la function s. Puede usar .bind() para volver a vincular this al método, de modo que aún pueda usar this dentro del método. Lo siguiente funciona para mantener this pero permitiéndole envolver sus métodos
import { Controller, Get } from '@nestjs/common'; import { AppService } from './app.service'; function wrapLogging(f: (...args: any[]) => any) { console.log('Calling method'); console.log(f); return async (...args) => { try { return await f(...args); } catch (e) { console.log(e); } }; } @Controller() export class AppController { constructor(private readonly appService: AppService) {} @Get() async getHello(): Promise<string> { const method = wrapLogging(this.appService.getHello.bind(this.appService)); return method(); } } import { Injectable } from '@nestjs/common'; @Injectable() export class AppService { private greeting = 'Hello World!'; getHello(): string { console.log('Returning greeting'); console.log(this); return this.greeting; } } xh :3000 HTTP/1.1 200 OK Connection: keep-alive Content-Length: 12 Content-Type: text/plain; charset=utf-8 Date: Tue, 08 Mar 2022 16:01:19 GMT Keep-Alive: timeout=5 Hello World! Calling method [Function: bound getHello] Returning greeting AppService { greeting: 'Hello World!' } Sugeriría seguir la ruta de un decorador y modificar descriptor.value en lugar de una función separada, ya que deberá hacer este bind cada vez que quiera envolver su método, pero al final depende de usted.