Мангуста.Постобработка ожидающих данных - PullRequest
0 голосов
/ 01 января 2019

Я являюсь фронтменом и делаю свой первый 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);
  }
}

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

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

1 Ответ

0 голосов
/ 09 января 2019

Постобработка данных производится стандартным методом .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);
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...