Пользовательский ответ службы перьев работает в консоли, но при ответе API получается пустой массив
У меня есть специальный сервис, который выбирает данные из нескольких моделей мангустов, создает массив с использованием этих данных и возвращает их в 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 ответа
Есть несколько вещей, которые можно сделать, чтобы улучшить этот код. Во-первых, что-нибудь в форме...
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
)?
Проблема была исправлена, когда я перезапустил службу перьев. Я не удаляю вопрос, потому что другой ответ может поделиться некоторыми знаниями