PersistedModel.create(Array)返回具有编号属性的对象

时间:2018-06-22 17:57:14

标签: typescript loopbackjs angular-loopback

下面是一段代码,该代码段使用值数组调用Loopback API方法。输入值正确,API上未引发任何错误,subscribe块按预期运行。

    const newStudentGroups =
            selectedStudentIds.map(sId => ({
                studentId: sId,
                groupId: this.group.id,
                schoolId: this.curSchool.id,
                programId: this.curProg.id,
            }));
   this.stuGroupApi.create(newStudentGroups)
       .subscribe((newStu) => {
          console.log(newStu.map(s=>s[0]));
       });

但是,作为newStu返回到订阅块的值显示为以下形式的对象:

{ 
  0:{
     studentId: 123,
     groupId: 321,  
     schoolId: 1,
     programId: 5
    },
  1:{
     studentId: 132,
     groupId: 322,  
     schoolId: 1,
     programId: 5
    },
  2:{studentId: 143,
     groupId: 331,  
     schoolId: 1,
     programId: 5
    }
}

我需要一个与输入相同的StudentGroup对象数组。我认识到我可以forkJoinJoin单独调用该API,但似乎有很多网络流量,而单个调用可以/应该批量运行数据库。

如果我做错了此事,或者是否有规范的方法可以将其恢复为发送时的格式,我找不到太多建议。这是错误吗?我打错电话了吗?

编辑:我一直在检查实际的网络请求,看起来回送实际上是根据需要返回数组。所以这一定是我那边的SDK。 @ mean-expert / loopback-sdk-builder是故意将​​数组转换为对象还是我配置错误?我使用的版本为“ @ mean-expert / loopback-sdk-builder”:“ ^ 2.1.0-rc.10.5”。

1 个答案:

答案 0 :(得分:0)

更新的答案

TL; DR 使用createMany函数而不是create

考虑到@ mean-expert / loopback-sdk-builder解析BaseLoopBackApi中的响应(应位于services/core中)的方式,调用create方法将尝试将响应解析回服务的通用数据类型(也许是StudentGroup用于您的通话?)。但是,默认情况下,此解析将使用Object.assign(this, data);。不幸的是,这将按照您显示的方式将数组转换为对象。

例如

Object.assign({}, ['hi', 'there'])

会产生

{ '0': 'hi', '1': 'there' }

但是,@ mean-expert / loopback-sdk-builder提供了另一个默认功能来为您解决该问题。只需将您的呼叫切换为使用createMany

因此:

const newStudentGroups = selectedStudentIds.map(sId => ({
    studentId: sId,
    groupId: this.group.id,
    schoolId: this.curSchool.id,
    programId: this.curProg.id,
}));
this.stuGroupApi.createMany(newStudentGroups)
   .subscribe(newStus => {
      console.log(newStus);
   });

原始答案

鉴于服务器的响应,您可以通过运行

来获得可用的阵列
this.stuGroupApi.create(newStudentGroups)
   .map(newStu => Object.keys(newStu).map(i => newStu[i]))
   .subscribe((newStu) => {
      console.log(newStu.map(s=>s[0]));
   });