求助:使用JSOM+REST API获取当前用户自定义用户配置文件属性失败
我来帮你排查并修复这个问题哈!从你给出的代码片段来看,主要问题是代码不完整,加上自定义用户属性的获取方式可能没找对,另外还有几个容易忽略的细节需要注意。
先确认几个前提条件
- 确保页面已经加载了jQuery(SharePoint默认页面不一定自带,需要手动引入)
- 确认当前用户拥有读取自身用户配置文件的权限
- 搞清楚自定义属性的内部名称(不是显示名称,比如显示名是"Employee Cost Center",内部名可能是
EmployeeCostCenter,无空格)
修复后的完整代码
<!-- 先引入jQuery,如果页面已经加载过可以去掉这行 --> <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script> <script> $(document).ready(function() { // 调用REST API获取当前用户的配置文件属性 $.ajax({ url: _spPageContextInfo.webAbsoluteUrl + "/_api/SP.UserProfiles.PeopleManager/GetMyProperties", method: "GET", headers: { "Accept": "application/json;odata=verbose" }, success: function(data) { try { // 获取用户基础信息 var displayName = data.d.DisplayName; var accountName = data.d.AccountName; // 遍历属性数组,查找自定义的"Employee Cost Center" var costCenter = ""; var userProperties = data.d.UserProfileProperties.results; for(let i = 0; i < userProperties.length; i++) { // 这里要填属性的内部名称,不是显示名称! if(userProperties[i].Key === "EmployeeCostCenter") { costCenter = userProperties[i].Value; break; } } // 将结果展示到页面上(假设页面有个id为userInfo的容器) $("#userInfo").html(` <p>用户名: ${displayName}</p> <p>账号: ${accountName}</p> <p>员工成本中心: ${costCenter || "未设置"}</p> `); } catch(err) { console.error("处理用户属性时出错:", err); $("#userInfo").text("加载用户信息失败,请查看控制台日志"); } }, error: function(xhr, status, error) { console.error("API请求失败:", error); console.log("响应详情:", xhr.responseText); $("#userInfo").text("获取用户信息失败,请查看控制台日志"); } }); }); </script> <!-- 页面上用于展示信息的容器 --> <div id="userInfo"></div>
关键修复点说明
- 补全代码逻辑:你原代码在
var properties = data.d...处截断了,自定义属性需要遍历UserProfileProperties.results数组才能找到,不能直接通过data.d.xxx访问 - 区分属性内部名称:自定义属性的
Key是后台存储的内部名称,和显示名称不一定一致,需要在SharePoint管理中心的用户属性设置里确认 - 添加错误处理:原代码没有错误回调,遇到权限不足、API地址错误等问题时无法排查,新增的
error和try-catch能帮你快速定位问题 - 确保DOM加载完成:用
$(document).ready()保证代码在页面元素加载完成后执行,避免找不到展示容器
不用jQuery的原生JS版本(可选)
如果不想依赖jQuery,也可以用原生Fetch API实现:
document.addEventListener("DOMContentLoaded", function() { fetch(_spPageContextInfo.webAbsoluteUrl + "/_api/SP.UserProfiles.PeopleManager/GetMyProperties", { method: "GET", headers: { "Accept": "application/json;odata=verbose" } }) .then(response => { if(!response.ok) throw new Error(`请求失败: ${response.status}`); return response.json(); }) .then(data => { var displayName = data.d.DisplayName; var accountName = data.d.AccountName; var costCenter = ""; var userProperties = data.d.UserProfileProperties.results; for(let i = 0; i < userProperties.length; i++) { if(userProperties[i].Key === "EmployeeCostCenter") { costCenter = userProperties[i].Value; break; } } document.getElementById("userInfo").innerHTML = ` <p>用户名: ${displayName}</p> <p>账号: ${accountName}</p> <p>员工成本中心: ${costCenter || "未设置"}</p> `; }) .catch(err => { console.error("出错:", err); document.getElementById("userInfo").textContent = "加载用户信息失败,请查看控制台日志"; }); });
内容的提问来源于stack exchange,提问作者Syed Iliyase
相关产品推荐
相关产品推荐

