0

我有一个自定义服务,它从多个猫鼬模型中获取数据并使用这些数据创建一个数组并返回给 API。

一切正常。我可以控制新的对象数组“result.rolePermissions”。您可以在下面的代码中看到这一点。

我的问题是当我检查前端的数据时,我得到一个空白数组作为响应。

我已经仔细检查了我是否错过了一个变量或使用了不同的 API 调用,但没有。我正在调用此自定义服务功能,但由于某种原因,我无法获取数据。

是因为在“result.roles”、“result.permission”上使用了 await/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
    }
  }
4

2 回答 2

1

可以做几件事来改进此代码。首先,任何形式的...

x = await new Promise(function(resolve, reject) {
    promiseReturningFunction(params).then(response => {
        resolve(response);
    });
});

...可以改写为...

x = await promiseReturningFunction(params);

...因为,当您有一个 promise-returning-function 时,没有必要创建另一个 promise(使用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而不是您刚刚构建并使用 log ( result.rolePermissions) 测试的对象?

于 2018-10-30T14:33:08.143 回答
0

当我重新启动羽毛服务时,该问题已得到解决。我没有删除该问题,因为其他答案可能会分享一些知识

于 2018-10-30T14:53:25.580 回答