问题描述
我在 node.js
和 mongoose
有 2 个路由器
1.组织路由器返回组织列表
router.get('/apI/Organizations/',async (req: Request,res: Response) => {
let { sort,filter } = req.query;
sort = sort == undefined ? {} : [JSON.parse(req.query.sort as string) || {}];
filter = sort == undefined ? {} : JSON.parse(req.query.filter as string) || {};
const organizations = await Organization.find({ filter }).sort(sort);
res.setHeader('Access-Control-Expose-Headers','Content-Range');
res.setHeader('Content-Range','organizations 0-20/500');
res.send(organizations);
});
2.项目路由器:返回每个项目与一个组织相关的项目列表。
router.get('/api/projects/',filter } = req.query;
sort = sort == undefined ? {} : [JSON.parse(req.query.sort as string) || {}];
filter = sort == undefined ? {} : JSON.parse(req.query.filter as string) || {};
const projects= await Projects.find({ filter }).sort(sort);
res.setHeader('Access-Control-Expose-Headers','projects0-20/500');
res.send(projects);
});
我想在每个路由器中同时启用排序和过滤,但有可能两者都将发送其中之一或都不发送。
在使用 react-admin
dataProvider 的 ra-data-simple-rest
客户端中,我拥有组织和项目的资源,
项目列表
<List {...props}>
<Datagrid rowClick="edit" >
<TextField source="name" />
<ReferenceField source="organizationId" reference="organizations">
<TextField source="name"/>
</ReferenceField>
<EditButton />
</Datagrid>
</List>
在项目列表中,如果 sort 和 fiter 在路由器中声明,则 ReferenceField
不会显示组织字段。
我被困住了, 如何在路由器上启用排序和过滤但保留 ReferenceField 选项? 有什么想法吗?
谢谢!
解决方法
使用 ra-data-simple-rest
,<ReferenceField>
发出 REST 查询,如下所示:
GET http://my.api.url/posts?filter={id:[123,456,789]}
您可能需要在控制器中添加一些特殊逻辑来处理过滤器中的数组值。 MongoDB 的语法是 { $in: array }
。
所以我会在将 filter
传递给 Mongoose 之前对其进行转换,例如:
filter = Object.keys(filter).reduce((acc,key) => {
const value = filter[key];
acc[key] = Array.isArray(value) ? { '$in': value } : value;
return acc;
},{});