我有一个自定义服务,该服务从多个猫鼬模型中获取数据,并使用这些数据创建一个数组,并返回给API。
一切正常。.我可以控制台新的对象数组'result.rolePermissions'。您可以在下面的代码中看到。
我的问题是,当我在前端检查数据时,得到一个空白数组作为响应。
我已经仔细检查了是否错过了变量或使用了其他API调用,但是没有。我正好在调用此自定义服务函数,但由于某种原因,我无法获取数据。
是因为在'result.roles','result.permission'上使用了wait / Promise吗?我使用了一些不良做法吗?
async find (params) {
let result = {};
result.roles = [];
result.rolePermissions = [];
result.permissionsModules = [];
const permissionGroupModel = this.app.service('permission-groups').Model;
const rolesModel = this.app.service('roles').Model;
const permissionsModel = this.app.service('permissions').Model;
//all permission-groups are getting fine
result.permissionsModules = await new Promise(function(resolve, reject) {
permissionGroupModel.find().populate('permissions').exec((err,response)=>{
resolve(response);
})
});
//all roles are getting fine
result.roles = await new Promise(function(resolve, reject) {
rolesModel.find().then(response=>{
resolve(response);
})
});
//all permissions are getting fine
result.permissions = await new Promise(function(resolve, reject) {
permissionsModel.find().then(response=>{
resolve(response);
})
});
//here is iam having trouble..
result.rolePermissions = await new Promise(function(resolve, reject) {
let rolePerms = [];
result.roles.forEach(role => {
rolePerms[role.name] = {};
result.permissions.forEach(permission => {
rolePerms[role.name][permission.name] = (role.permissions.indexOf(permission._id) > -1)?true:false;
});
});
resolve(rolePerms);
});
//I have consoled result.rolePermissions and it shows the currect data.but when this data getting as null array in api call response
console.log('result.rolePermissions')
console.log(result.rolePermissions)
return {
status:true,
test:data.rolePermissions,
data:result
}
}
答案 0 :(得分:1)
可以做一些事情来改进此代码。首先,任何形式...
x = await new Promise(function(resolve, reject) {
promiseReturningFunction(params).then(response => {
resolve(response);
});
});
...可以改写为...
x = await promiseReturningFunction(params);
...因为,当您具有承诺返回功能时,不需要创建另一个承诺(使用new Promise
)。
您指出问题所在的代码似乎根本不需要承诺...
//here is iam having trouble..
result.rolePermissions = [];
result.roles.forEach(role => {
rolePerms[role.name] = {};
result.permissions.forEach(permission => {
rolePerms[role.name][permission.name] (role.permissions.indexOf(permission._id) > -1)?true:false;
});
});
最后,我对在此代码中使用data
感到困惑...
return {
status:true,
test:data.rolePermissions,
data:result
}
虽然您对Promises的使用是非标准且令人困惑的,但该代码还是很有用的,而真正的问题出在传递data.rolePermissions
而不是您刚刚使用日志(result.rolePermissions
?
答案 1 :(得分:0)
当我重新启动Feathers服务时,此问题已修复。我没有删除问题,因为其他答案可能共享一些知识