PersistedModel.create(数组)returns 具有编号属性的对象

PersistedModel.create(Array) returns an object with numbered properties

下面是一段代码,它使用值数组调用 Loopback API 方法。输入值正确,没有像预期的那样在 API 和订阅块 运行 上抛出任何错误。

    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 对象数组,与我输入的对象相同。我知道我可以 forkJoin 对 API 的单个调用,但这似乎比单个调用 could/should 运行 作为数据库上的一个批次。

如果我做错了,或者是否有一种规范的方法可以将其恢复为我发送它时所用的形式,我找不到太多建议。这是一个错误吗?我 运行 是不是调用错了?

编辑:我一直在检查实际的网络请求,看起来 Loopback 实际上正在按要求返回数组。所以这必须是我这边某处的 SDK。 @mean-expert/loopback-sdk-builder 是故意将数组转换为对象还是我配置错误?我的版本是"@mean-expert/loopback-sdk-builder": "^2.1.0-rc.10.5".

更新答案

长话短说;博士 使用 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]));
   });