下面是一段代码,该代码段使用值数组调用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”。
答案 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]));
});