Spread Operator 和 路由踩坑

测试员
• 阅读 835

序言
本周在写分页查询的时候遇到了关于...运算符的问题,想到之前例会提过这个运算符,但是当自己独立使用时还是会遇到问题。

分页查询

查询条件:name

export class TeacherIndexComponent implements OnInit {

    pageable = new Pageable();
    loading = true;
    isOkLoading = false;
    teachers = new Array<Teacher>();
    teacherPage = new Page<Teacher>();
    params: Params;
    nameFormControl = new FormControl('');

    constructor(private teacherService: TeacherService,
                private systemConfig: SystemConfigService,
                private route: ActivatedRoute) {
    }

    // 初始化
    ngOnInit() {
        this.route.queryParams.subscribe((params: {page?: string, size?: string}) => {
            this.nameFormControl.setValue(params['name']);
            this.reload(params);
        });
    }

    onSubmit(): void {
        const name = this.nameFormControl.value;
        this.reload({...this.params, ...{name}});
    }

    /**
     * 查询
     * @param params page: 当前页 size: 每页大小
     */
    reload(params: Params): void {
        // 发起查询params
        this.params = params;
        this.teacherService.pageByName(
            // 调用stringToIntegerNumber将查询的字符串转为number
            getDefaultWhenValueIsInValid(params['page'], '0'),
            getDefaultWhenValueIsInValid(params['size'], this.systemConfig.getPageSize()),
            {
                name: params['name'],
            },
        ).subscribe(page => {
            this.teacherPage = page;
        });
    }

    /**
     * 点击分页
     * @param page 当前页
     */
    onPageChange(page: number): void {
        this.reload({...this.params, ...{page}});
    }

    /**
     * 点击改变每页大小
     * @param size 每页大小
     */
    onSizeChange(size: number): void {
        this.reload({...this.params, ...{size}});
    }
}

这是正确代码,但是当我将 onSubmit()方法改成如下:

onSubmit(): void {
        // 将{name}直接改成this.nameFormControl.value
        this.reload({...this.params, ...this.nameFormControl.value});
    }

此时如果nameFormControl.value为'name',那么在控制台打印的结果就是:
Spread Operator  和 路由踩坑
将一个‘name’字符串直接变成一个数组对象?

踩坑记录

此时当我使用param['name]时,获取到的恒为undefined,不断打断点之后发现错误所在。
对比其他写法:{...this.params, ...{xxx}}

猜测:

const name1 = 'name';
console.log({name1}); // 打印结果是{name1: 'name'}

结果:

Spread Operator  和 路由踩坑

Spread Operator

何为扩展操作符呢?

The main objective of the spread operator is to spread the elements of an array or object.
简言之:扩展数组或对象元素

扩展对象使用
示例一:

const point2D = {x: 1, y: 2};
const anotherPoint3D = {x: 5, z: 4, ...point2D};
console.log(anotherPoint3D); // {x: 1, y: 2, z: 4}
const yetAnotherPoint3D = {...point2D, x: 5, z: 4}
console.log(yetAnotherPoint3D); // {x: 5, y: 2, z: 4}

示例二:

const foo = {a: 1, b: 2, c: 0};
const bar = {c: 1, d: 2};
/** Merge foo and bar */
const fooBar = {...foo, ...bar};
// fooBar is now {a: 1, b: 2, c: 1, d: 2}

路由踩坑

C层代码

@PutMapping("{dutyId}, {districtId}")
  @JsonView(UpdateJsonView.class)
  public PartBuilding update(
      @PathVariable Long dutyId,
      @PathVariable Long districtId,
      @RequestBody PartBuilding partBuilding) {
    return this.partBuildingService.update(dutyId, districtId, partBuilding);
  }

单元测试代码:

@Test
  void update() throws Exception {
    Long dutyId = new Random().nextLong();
    Long districtId = new Random().nextLong();

    PartBuilding newPartBuilding = getOnePartBuilding();
    PartBuilding oldPartBuilding = getOnePartBuilding();

    String jsonString = JSON.toJSONString(newPartBuilding,
        SerializerFeature.DisableCircularReferenceDetect);
    String url = this.baseUrl + "/" + dutyId.toString() + "," + districtId.toString();

    Mockito.doReturn(oldPartBuilding).when(this.partBuildingService)
        .update(Mockito.anyLong(), Mockito.anyLong(), Mockito.any(PartBuilding.class));

    MockHttpServletRequestBuilder putRequest = MockMvcRequestBuilders
        .put(url)
        .contentType(MediaType.APPLICATION_JSON)
        .content(jsonString);

    this.mockMvc.perform(putRequest)
        .andExpect(status().isOk());

    ArgumentCaptor<PartBuilding> partBuildingArgumentCaptor = ArgumentCaptor.forClass(PartBuilding.class);
    ArgumentCaptor<Long> dutyIdArgumentCaptor = ArgumentCaptor.forClass(Long.class);
    ArgumentCaptor<Long> districtIdArgumentCaptor = ArgumentCaptor.forClass(Long.class);
    Mockito.verify(this.partBuildingService).update(
        dutyIdArgumentCaptor.capture(),
        districtIdArgumentCaptor.capture(),
        partBuildingArgumentCaptor.capture());
    org.assertj.core.api.Assertions
        .assertThat(dutyIdArgumentCaptor.getValue()).isEqualTo(dutyId);
    org.assertj.core.api.Assertions
        .assertThat(districtIdArgumentCaptor.getValue()).isEqualTo(districtId);
    org.assertj.core.api.Assertions.assertThat(
        partBuildingArgumentCaptor.getValue().getUser().getId()
            .equals(newPartBuilding.getUser().getId()));
  }

结果:一直报404!
再测试其他类似的路由如:getById,单元测试也过不去了。

检查:Spread Operator  和 路由踩坑

原因:在写其他地方的时候,由于看到了此处没有空格,习惯的加上空格了,但是路由有自己的rules,多加空格必然不被允许!

点赞
收藏
评论区
推荐文章
菜鸟阿都 菜鸟阿都
4年前
pageHelper一对多分页解决方案
前言   pageHelper是一款优秀的Mybatis分页插件,在项目中可以非常便利的使用,使开发效率得到很大的提升,但不支持一对多结果映射的分页查询,所以在平时的使用时,对于一对多分页会出现分页错误,这篇文章主要对pageHelper分页错误进行重现以及提出解决方案。分析    mybatis进行一对多查询时,映射文件(mapper.xml
Easter79 Easter79
3年前
sql优化之大数据量分页查询(mysql)
当需要从数据库查询的表有上万条记录的时候,一次性查询所有结果会变得很慢,特别是随着数据量的增加特别明显,这时就需要使用分页查询。对于数据库分页查询,也有很多种方法和优化的点。谈优化前的准备工作为了对下面列举的一些优化进行测试,需要使用已有的一张表作为实际例子。表名:order\_history。描述:某个业务的订单历史表。主要字段
Easter79 Easter79
3年前
springBoot+react实现增改查
1、页面查询功能带分页后端代码:/ @AuthorMc @Description:根据条件查询角色列表信息 @Date2018/4/1910:49 /@OverridepublicResp
虾米大王 虾米大王
2年前
java代码092
code092.jsp通过FindServlet类查询分页数据所有图书信息ID图书名称价格数量作者<%Listlist1(List)request.getAttribute("list");for(code089book:list1)%
Wesley13 Wesley13
3年前
JPA分页查询与条件分页查询
情有独钟的JPA平时在写一些小项目时,比较喜欢引用SpringDataJpa,其实还是图他写代码快~在日常的开发工作中,分页列表查询基本是随处可见,下面一起看一下如何使用jpa进行多条件查询以及查询列表分页呢?关于JPA的使用关于jpa的使用,下面2步简单过一下,详细资料,小伙伴自行搜索一下吧~
Wesley13 Wesley13
3年前
mysql5.6 分页查询优化
mysql5.6分页查询优化场景:表结构:主键(非自增)contentCode(varchar),过滤条件列为updateTime(timeStamp),已经为timestamp建立索引。搜索sql为:SELECTFROMmy_hello_tableWHEREupdat
Wesley13 Wesley13
3年前
MySQL · 性能优化 · MySQL常见SQL错误用法
1\.LIMIT语句分页查询是最常用的场景之一,但也通常也是最容易出问题的地方。比如对于下面简单的语句,一般DBA想到的办法是在type,name,create\_time字段上加组合索引。这样条件排序都能有效的利用到索引,性能迅速提升。SELECTFROMoperationWHEREty
Wesley13 Wesley13
3年前
mysql数据库的查询
1、“查”——之单表查询INSERTINTOstudent2(name,grade,gender)VALUES('songjiang',40,'男'),('wuyong',100,'男'),('qinming',90,'男'),('husanniang',88,'女'),('sunerniang',66,'女'),('wus
Wesley13 Wesley13
3年前
MYSQL常用查询
一、MYSQL查询的五种子句where(条件查询)、having(筛选)、groupby(分组)、orderby(排序)、limit(限制结果数)【1】where:比较运算符    ,<,,!(<),,<in(param1,p
研发日常踩坑-Mysql分页数据重复 | 京东云技术团队
踩坑描述:写分页查询接口,orderby和limit混用的时候,出现了排序的混乱情况在进行第N页查询时,出现与第一前面页码的数据一样的记录。问题在MySQL中分页查询,我们经常会用limit,如:limit(0,20)表示查询第一页的20条数据,limit
java线程池原理浅析
问题与解决:问题:查询大数据量的时候,例如一次返回50w数据量的包,循环去查询发现读取会超时。解决方案:经过思考采用多线程去分页查询。使用线程池创建多个线程去查询分页后的数据最后汇总一下,解决了一次查询大量数据返回超时的问题。一次查询现状:多线程分页查询改