首页 > 解决方案 > 端点冲突

问题描述

每当我执行以下端点时,我都会收到 ID 类型错误。

Request GET /lists/45 failed with status code 500. error: invalid input syntax for type uuid: "45"

有问题的端点:

//  @get('/blabla/{color}', {   //---> Works!
  @get('/lists/{color}', {   //---> Error!
    responses: {
      '200': {
        description: 'Query all lists by color',
      },
    },
  })
  async getListByColor(@param.path.string('color') color: number): Promise<number> {
    return this.listsRepository.dataSource.execute("SELECT * FROM public.lists as li WHERE li.color = " + color);
  }

另一个端点工作正常:

  @get('/lists/{id}', {
    responses: {
      '200': {
        description: 'Lists model instance',
        content: {
          'application/json': {
            schema: getModelSchemaRef(Lists, {includeRelations: true}),
          },
        },
      },
    },
  })
  async findById(
    @param.path.string('id') id: string,
    @param.filter(Lists, {exclude: 'where'}) filter?: FilterExcludingWhere<Lists>
  ): Promise<Lists> {
    return this.listsRepository.findById(id, filter);
  }

标签: node.jstypescriptloopbackjsloopback4

解决方案


这 2 个端点,/lists/{color}对于/lists/{id}REST 路由器来说是无法区分的,因为两条路径都将解析为/lists/{an arbitrary string}. 因此,路由器可能会将流量路由到需要 UUID 数据类型 ID 的错误端点。因此,数据库引擎级错误。

另请注意,第一个示例容易受到 SQL 注入攻击。请考虑改用参数化 SQL


推荐阅读