API控制器:无法输入,无法删除(找不到404)

时间:2018-12-02 11:54:08

标签: node.js rest express postman nestjs

使用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的基本文档,带有控制器和服务的模块,并为实体“ Hero”注入typeorm存储库。

使用Postman,@ Get,@ Get(':id')和@Post都可以正常工作,我的实体->存储库->服务->控制器连接到本地Postgres数据库,我可以获取/添加/更新具有这些API端点的Hero表中的数据。

但是,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相同),我尝试通过在参数中或在带有x-www-form-urlencoded的正文中添加id:1来进行尝试。

请求似乎从来没有到达控制器(什么都没有),我已经向Nest.js添加了一个全局拦截器,正是这样做的:

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

但是它再次仅记录GET和POST请求,其他请求则永远不会出现。

让我感到困惑的是,我几乎遵循了Nest.js文档,做了一个基本的控制器和服务,将实体/存储库连接到了DB,似乎不需要任何其他操作,并且但是PUT和DELETE似乎不存在。

1 个答案:

答案 0 :(得分:1)

从msg判断无法输入/ hero,您正在发出/ hero请求,而不是例如/ hero / 1

  

对此的请求是localhost:3000 / hero(端点与GET和POST相同),我尝试通过在参数中或在带有x-www-form-urlencoded的正文中添加id:1来进行尝试。

应该使用localhost:3000/hero/<id_here>完成PUT请求,以为您混淆了查询参数和路径参数。

应该在localhost:3000/hero/delete/<id_here>

上进行删除