Sails.js按id筛选populate关联参与者时提示not a function错误怎么解决
错误原因
- 你混淆了Sails.js ORM(Waterline)的查询语法和原生JavaScript数组方法的使用规则:
event.participants在populate执行完成后已经是普通的对象数组,不是ORM查询实例,不能直接传入对象作为参数调用find - 原生
Array.find()方法要求传入的参数是回调函数,你传入的{id:3}是对象类型,不符合方法入参要求,因此抛出「不是函数」的类型错误 - 额外说明:
event.participants是同步可访问的数组,不需要加await前缀,属于多余操作
解决方法
方案1:使用原生数组方法过滤(适合小数据量场景)
如果要获取id为3的单条学生数据,修改代码为:
var participants = event.participants.find(item => item.id === 3);
如果需要保持和原接口一致的数组返回格式,改用filter方法:
var participants = event.participants.filter(item => item.id === 3);
方案2:在populate阶段直接过滤(性能更优)
直接在关联查询的时候就指定过滤条件,不需要拿到全量参与者数据后再筛选:
detail: async function (req, res) { var thatEvent = await Event.findOne(req.params.eventid); if (!thatEvent) return res.notFound(); var event = await Event.findOne(req.params.eventid).populate( "participants", { where: { id: 3 } } ); if (!event) return res.notFound(); return res.json(event.participants); },
内容的提问来源于stack exchange,提问作者anonymous
相关产品推荐
相关产品推荐

