Feathers自定义服务响应可在控制台中运行,但API响应上的数组为空

时间:2018-10-30 10:35:28

标签: promise async-await feathersjs feathers-service

我有一个自定义服务,该服务从多个猫鼬模型中获取数据,并使用这些数据创建一个数组,并返回给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
    }
  }

2 个答案:

答案 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服务时,此问题已修复。我没有删除问题,因为其他答案可能共享一些知识