我是前端发布者,我使用基于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是不可接受的方式。但是我应该怎么做才能获得所需的结果?
答案 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);
}
}