使用okta-sdk-nodejs的listUsers方法调用OKTA搜索用户API无返回数组
问题根因
okta-sdk-nodejs 的 listUsers 方法返回值不是直接包含结果的Promise,而是一个 Collection 集合实例,你直接将其放入Promise.all中等待,只会拿到未执行数据拉取的集合对象,不会触发实际的接口请求,所以返回的currentItems是空数组。Postman直接调用接口是直接拿到了响应结果,和SDK的封装逻辑不同。
解决方案
方案1:使用内置each迭代器(推荐,自动处理分页)
each方法会自动发起请求拉取所有匹配的用户,支持自动分页,方法本身返回Promise,可以用await等待执行完成:
async getUsersByEmail(value) { try { const userList = []; // 必须加await等待each遍历完成 await oktaClient.listUsers({ search: value }).each(user => { // 遍历到每个匹配的用户,存入数组 userList.push(user); }); console.log('匹配用户结果:', userList); return userList; } catch (e) { throw Error('Cannot get the users: ' + e); } }
方案2:手动调用next方法拉取数据
如果需要自行控制拉取逻辑,可以调用集合的next()方法逐页获取:
async getUsersByEmail(value) { try { const userList = []; const collection = oktaClient.listUsers({ search: value }); // 逐页拉取直到没有更多数据 let page = await collection.next(); while(page.value) { userList.push(...page.value); page = await collection.next(); } console.log('匹配用户结果:', userList); return userList; } catch (e) { throw Error('Cannot get the users: ' + e); } }
注意事项
动态拼接search查询条件时,要注意转义查询值里的特殊字符,避免出现搜索语法错误。你之前测试官方each示例没拿到结果,大概率是没有加await等待执行完成,直接提前读取了还没填充的结果数组。
内容的提问来源于stack exchange,提问作者Nandishwar Garg
相关产品推荐
相关产品推荐

