2 votes

Utilisation de sendFile dans le contrôleur tsoa

Je veux créer un point de terminaison qui renvoie le contenu d'un fichier en utilisant sendFile. En écrivant la route moi-même dans mon application Express, je sais quoi faire et ça fonctionne :

   app.get('/api/logs', (req, res) => { 
      var path = require('path'); 
      res.sendFile(path.join(__dirname, '../../../..', 'file.log')); 
    });

Mais comme j'utilise tsoa, j'ai besoin d'écrire ceci dans mon contrôleur que je ferais de cette façon :

@Route('getlogs')
export class LoggerController extends Controller {
  @Get()
  async getLogs(@Response("") res: express.Response) {
    let filePath = path.join(__dirname, '../../../..', 'file.log');
    res.sendFile(filePath);
    return res;
  }
}

mais en faisant cela, je rencontre l'erreur suivante :

 Generate routes error.
 Error: Multiple matching models found for referenced type Response; please make model names unique. 

Cela est vrai. J'ai un modèle pour Response dans node_modules/aws-sdk et dans node_modules/@types. Donc j'imagine que je ne devrais peut-être pas utiliser express.Response dans cette configuration. Cela ne devrait pas être si difficile à faire.

Si quelqu'un a une idée sur comment gérer cela, je serais très reconnaissant.

0voto

SuicideS3ason Points 56

Je pense que votre erreur provient plutôt du décorateur @Response() que vous utilisez, plutôt que de l'objet express.Response.

En consultant la tsoa documentation pour les réponses, on peut voir ce qui suit :

Seulement tsoa >= 3.1

Dans les versions récentes de tsoa, nous avons la possibilité d'injecter une fonction répondante agnostique au framework dans notre fonction que nous pouvons appeler pour formuler une réponse qui ne respecte pas le type de retour de la méthode du contrôleur/code d'état et en-têtes (qui est utilisé pour la réponse réussie). Cela est particulièrement utile pour répondre avec une réponse d'erreur sans risque de désaccord de types associé aux erreurs lancées. Afin d'injecter un ou plusieurs répondants, nous pouvons utiliser le décorateur @Res()

import { Route, Controller, Get, Query, Res, TsoaResponse } from 'tsoa'

@Route('/greeting')
export class GreetingsController extends Controller {
  /**
   * @param notFoundResponse La fonction répondante pour une réponse introuvable
   */
  @Get('/')
  public async greet(@Query() name?: string, @Res() notFoundResponse: TsoaResponse<404, { reason: string }>): Promise {
    if (!name) {
      notFoundResponse(404, { reason: "Nous ne vous connaissons pas encore. Veuillez fournir un nom" });
    }

    return `Bonjour, ${name}`;
  }

Je ne l'ai pas encore testé, mais cela devrait fonctionner également pour votre scénario.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X