Пользовательский ответ службы перьев работает в консоли, но при ответе API получается пустой массив - PullRequest
0 голосов
/ 30 октября 2018

У меня есть специальный сервис, который извлекает данные из нескольких моделей мангустов, создает массив, используя эти данные, и возвращает API.

Все работает хорошо. Я могу утешить новый объектный массив 'result.rolePermissions'. Вы можете увидеть это в коде ниже.

Моя проблема заключается в том, что, когда я проверяю данные на стороне интерфейса, я получаю пустой массив в качестве ответа.

Я дважды проверил, пропустил ли я переменную или использовал другой вызов API, но нет. Я точно вызываю эту пользовательскую сервисную функцию, но по какой-то причине я не могу получить данные.

Это из-за использования await / Promise для 'result.roles', 'result.permission'? Я использовал некоторые плохие методы?

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 голосов
/ 30 октября 2018

Проблема была исправлена, когда я перезапустил службу перьев. Я не удаляю вопрос, потому что другой ответ может поделиться некоторыми знаниями

0 голосов
/ 30 октября 2018

Есть несколько вещей, которые можно сделать, чтобы улучшить этот код. Во-первых, что-нибудь в форме ...

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)

...