Контроллер API: Cannot PUT, Cannot DELETE (404 не найдено) - PullRequest
0 голосов
/ 02 декабря 2018

С Nest.js и базовым контроллером:

import { Body, Controller, Delete, Get, Param, Post, Put, Query } from '@nestjs/common';
import { Hero } from '../entities/hero.entity';
import { HeroService } from './hero.service';

@Controller('hero')
export class HeroController {
  constructor(private readonly heroesService: HeroService) {}

  @Get()
  async get(@Query() query): Promise<Hero[]> {
    return await this.heroesService.find(query);
  }

  @Get(':id')
  async getById(@Param('id') id): Promise<Hero> {
    return await this.heroesService.findById(id);
  }

  @Post()
  async add(@Body() hero: Hero): Promise<Hero> {
    return await this.heroesService.save(hero);
  }

  //TODO: doesn't seem to work, never called (request 404)
  @Put(':id')
  async update(@Param('id') id, @Body() hero): Promise<Hero> {
    console.log('hey');
    return await this.heroesService.update(id, hero);
  }

  //TODO: doesn't seem to work, never called (request 404)
  @Delete('/delete/:id')
  async remove(@Param('id') id): Promise<Hero> {
    console.log('hey');
    return await this.heroesService.remove(id);
  }
}

В соответствии с базовой документацией nest.js, модуля с контроллером и службой, внедряющего репозиторий typeorm для сущности 'Hero'.

Используя Postman, оба @Get, @Get (': id') и @Post работают отлично, мой контроллер entity-> repository-> service-> подключается к моей локальной базе данных Postgres, и я могу получить/ add / update данные из таблицы Hero с этими конечными точками API.

Однако запросы PUT и DELETE отвечают:

{
    "statusCode": 404,
    "error": "Not Found",
    "message": "Cannot PUT /hero"
}

X-Powered-By →Express
Content-Type →application/json; charset=utf-8
Content-Length →67
ETag →W/"43-6vi9yb61CRVGqX01+Xyko0QuUAs"
Date →Sun, 02 Dec 2018 11:40:41 GMT
Connection →keep-alive

Запрос на это localhost: 3000 / hero (то же самое)конечная точка как GET и POST), я пытался добавить id: 1 в Params или в теле с x-www-form-urlencoded.

Похоже, что запросы никогда не доходят доконтроллер (ничего не называется), я добавил глобальный перехватчик в Nest.js, который просто делает это:

intercept(
    context: ExecutionContext,
    call$: Observable<any>,
  ): Observable<any> {
    console.log(context.switchToHttp().getRequest());
    return call$;
  }

Но опять-таки он только регистрирует запросы GET и POST, остальные никогда не появляются.

Что меня смущает, так это то, что я следовал документу Nest.js,сделал базовый контроллер и службу, сущность / репозиторий, подключенный к БД, похоже, больше ничего не нужно для того, чтобы это работало, и все же PUT и DELETE, по-видимому, не существуют.

1 Ответ

0 голосов
/ 02 декабря 2018

Судя по сообщению msg. Невозможно PUT / герой, который вы делаете / запрос героя, а не, например, / hero / 1

Запрос на это localhost: 3000 / герой (та же конечная точка, что и GET иPOST), я пытался добавить id: 1 в Params или в теле с x-www-form-urlencoded.

Запрос PUT должен выполняться с localhost:3000/hero/<id_here> Думаю, выпутают параметры запроса с параметрами пути.

Одновременно УДАЛЕНИЕ должно быть выполнено localhost:3000/hero/delete/<id_here>

...