如何正确使用dataloader的loadMany函数?传参报错解决方案
Dataloader
loadMany 运行报错修复方案 报错原因
错误触发的直接原因是loadMany()方法的参数不符合要求:该方法要求传入由待加载key组成的数组,但代码中对ID数组调用了.toString(),实际传入的是逗号分隔的ID字符串,和报错提示中输出的内容完全匹配。
代码还存在一个隐藏逻辑bug:批量查询返回的MongoDB文档_id字段默认是ObjectId类型,和传入的字符串类型ID做全等匹配时会失败,即使参数传对了最终也会返回全量undefined的结果。
修复方案
- 修改解析器中
loadMany的传参逻辑
去掉数组整体调用的.toString(),直接传入ID数组,如需保证类型一致可逐个将数组内的ID转为字符串:subCategory: async (parent, _, { loaders }) => { // 传入数组类型参数,逐个转换ID类型避免匹配异常 const subcategory = await loaders.subCategory.loadMany( parent.subCategory.map(id => id.toString()) ) return subcategory; } - 修正批量加载函数的匹配逻辑
对比ID时将两边值都转为字符串,避免ObjectId与字符串类型全等判断失效的问题://Models const {Subcategory} = require("../Models/categoryModel"); module.exports.batchSubCategory = async (categoryIds) => { const subcategories = await Subcategory.find({_id: {$in: categoryIds}}); return categoryIds.map(categoryId => subcategories.find(category => category._id.toString() === categoryId.toString()) ); }
额外注意:你当前在Apollo Context中按请求初始化Dataloader实例的写法是正确的,不要将Dataloader实例定义为全局变量,否则会出现跨请求缓存污染、数据错乱的问题。
内容的提问来源于stack exchange,提问作者Samia Sammi
相关产品推荐
相关产品推荐

