猫鼬。等待数据的后处理

时间:2019-01-01 11:12:41

标签: node.js express mongoose async-await mongoose-populate

我是前端发布者,我使用基于Express + MongoDB的RBAC编写了第一个API。我需要对await函数所拥有的Role权限进行后处理。示例(这段代码很好用):

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是不正确的。在我的情况下,用Promises代替async / await是不可接受的方式。但是我应该怎么做才能获得所需的结果?

1 个答案:

答案 0 :(得分:0)

数据后处理通过Schema的标准方法.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);
  }
}