How do I receive route parameters in a controller in Typescript?

Asked

Viewed 19 times

0

I have the simple routes.ts:

import { Router } from 'express'
import UserController from './controllers/UserController';

const routes = Router();

routes.get('/:User', UserController.index);

export default routes;

And then on my controller UserController:

import { Request, Response } from 'express'
import axios from 'axios';

const api = axios.create({
    baseURL: 'api.exemplo.privada'
});


export default {
    async index(Req: Request, Res: Response, User: String) {
        api
            .get('/' + User)
            .then((ApiResponse) => {
                return Res.send(ApiResponse.data)
            })
            .catch((err) => {
                console.error(err);
            });
    }
};

When I pass User as parameter in Controller, I get the following error

  A última sobrecarga gerou o seguinte erro.
    O argumento do tipo '(Req: Request<ParamsDictionary, any, any, ParsedQs, Record<string, any>>, Res: Response<any, Record<string, any>>, User: String) => Promise<...>' não é atribuível ao parâmetro do tipo 'Application'.
      O tipo '(Req: Request<ParamsDictionary, any, any, ParsedQs, Record<string, any>>, Res: Response<any, Record<string, any>>, User: String) => Promise<...>' não tem as propriedades a seguir do tipo 'Application': init, defaultConfiguration, engine, set e mais 61.ts(2769)"

And this is what I do not understand, because if I pass only the User as parameter, thus, giving a Console, the Controller normally receives it. Everything turns out okay!:

export default {
    async index(User: String) {
       console.log(User)
    }
};

As well, when I only pass the Express Request and Response, with the API giving Get direct (without the User parameter), also wheel ok! (?):

export default {
    async index(Req: Request, Res: Response) {
        api
            .get('/UserUmExemplo')
            .then((ApiResponse) => {
                return Res.send(ApiResponse.data)
            })
            .catch((err) => {
                console.error(err);
            });
    }
};

Can someone explain to me why I can’t use the Express+ parameters of the route at the same time?

In the case, (async index(Req: Request, Res: Response, User: String)).

  • 1

    Because the third parameter has to be the type NextFunction

  • So I pass as Null, and User passes as fourth?

  • 1

    No. If you analyze the type, you will see that it does not accept any string. And I could not understand why this User. Why not extract via req.params.User

  • In fact, it makes more sense, but my doubt was pertinent to the same parameters, thank you for explaining friend, I will look about NextFunction . I parachuted into Typescript today.

No answers

Browser other questions tagged

You are not signed in. Login or sign up in order to post.