Мангуста. Постобработка ожидающих данных

Я являюсь фронтендером и делаю свой первый API с RBAC на основе Express + MongoDB. Мне нужно постобработать разрешения роли, которые у меня есть с помощью функции ожидания. Пример (этот код отлично работает):

export async function getRoleById(req, res) {
  try {
    const role = await Role.findById(req.params.id)
      .populate('permissions');
    return res.status(HTTPStatus.OK).json(role);
  } catch (err) {
    return res.status(HTTPStatus.BAD_REQUEST).json(err);
  }
}

Результат:

{
    "id": "5c27d6bfc51081331411dcd8",
    "name": "writer2",
    "permissions": [
        {
            "id": "5c27c43e2eb0c279ccd945ef",
            "action": "create",
            "subject": "task"
        },
        {
            "id": "5c27c4532eb0c279ccd945f1",
            "action": "read",
            "subject": "task"
        }
    ]
}

Но мне нужен другой формат разрешений:

{
    "id": "5c27d6bfc51081331411dcd8",
    "name": "writer2",
    "permissions": [
        [ "create", "article" ],
        [ "list", "user" ]
    ]
}

Итак, я попытался сделать это:

export async function getRoleById(req, res) {
  try {
    const role = await Role.findById(req.params.id)
      .populate('permissions')
      .then((foundRole) => {
        foundRole.permissions = foundRole.permissions.map(item => [ item.action, item.subject]);
        return foundRole;
      });
    return res.status(HTTPStatus.OK).json(role);
  } catch (err) {
    return res.status(HTTPStatus.BAD_REQUEST).json(err);
  }
}

Замена then на exec ситуации не меняет. После выполнения этого кода у меня есть ответ 200, но без данных. Пустая страница вместо объекта с данными роли.

Я прочитал много статей о запросах Mongoose и о том, почему использование async / await с обратными вызовами неверно. Замена async / await на Promises неприемлема в моей ситуации. Но что мне делать, чтобы получить нужный мне результат?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
99
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Постобработка данных производится стандартным методом .toJSON() схемы. Таким образом, мы можем создать наш собственный метод, например .toMyJSON() или переопределенный стандартный метод. Я выбираю второй путь.

В файле role.model.js, куда я поместил схему ролей:

import mongoose, { Schema } from 'mongoose';
import uniqueValidator from 'mongoose-unique-validator';

import User from '../users/user.model';

const RoleSchema = new Schema({
  /* here goes Schema */
});

/* Redefine standard method toJSON */
RoleSchema.methods = {
  toJSON() {
    return {
      id: this._id,
      name: this.name,
      permissions: this.permissions.map(item => [item.action, item.subject]),
    };
  },
};

RoleSchema.statics = {
    /* Here goes static methods of Schema */
};

export default mongoose.model('Role', RoleSchema);

И теперь мы можем использовать этот метод:

export async function getRoleById(req, res) {
  try {
    const role = await Role.findById(req.params.id).populate('permissions');
    return res.status(HTTPStatus.OK).json(role.toJSON()); // Here we use toJSON method.
  } catch (err) {
    return res.status(HTTPStatus.BAD_REQUEST).json(err);
  }
}

Другие вопросы по теме