使用JavaScript通过WIQL借助VSTS返回工作项详情的问题
解决WorkItemTrackingHttpClient仅返回ID和URL的问题
我之前也踩过这个坑!你遇到的问题核心原因是:WorkItemTrackingHttpClient的默认查询行为只会返回精简的WorkItemReference对象,也就是只包含ID和URL,哪怕你在WIQL的SELECT语句里指定了字段也没用——因为这个层级的查询只是用来定位工作项,并不会自动拉取字段数据。
要获取Completed Work这类具体字段,你需要做两件事:
1. 确保使用正确的API方法并指定字段/展开参数
有两种常见的解决方式:
方式一:在查询时指定$expand=Fields
如果你用的是queryByWiql方法,需要在请求选项里添加$expand参数来获取字段数据:
function newGetWorkItems(queryType, iterationPath, projectId, listOfQueries) { var queryClient = VSS_Service.getCollectionClient(TFS_Wit_QueryAPI.WorkItemTrackingHttpClient); // 假设你的WIQL查询已经包含目标字段的SELECT语句 var wiqlQuery = { query: "SELECT [System.Id], [System.Title], [System.CompletedWork] FROM WorkItems WHERE ..." // 替换为你的查询逻辑 }; // 关键:添加expand参数拉取字段数据 return queryClient.queryByWiql(wiqlQuery, projectId, undefined, undefined, undefined, "$expand=Fields") .then(function(queryResult) { if (queryResult.workItems.length === 0) { return []; } // 现在每个工作项会包含fields属性 return queryResult.workItems.map(item => { return { id: item.id, title: item.fields["System.Title"], completedWork: item.fields["System.CompletedWork"], url: item.url }; }); }); }
方式二:用getWorkItems方法批量拉取指定字段
如果你的查询已经拿到了工作项ID列表,可以直接用getWorkItems方法,显式指定需要的字段:
function newGetWorkItems(queryType, iterationPath, projectId, listOfQueries) { var queryClient = VSS_Service.getCollectionClient(TFS_Wit_QueryAPI.WorkItemTrackingHttpClient); // 先执行WIQL查询拿到工作项ID列表 var wiqlQuery = { query: "SELECT [System.Id] FROM WorkItems WHERE ..." // 仅用ID定位即可 }; return queryClient.queryByWiql(wiqlQuery, projectId) .then(function(queryResult) { if (queryResult.workItems.length === 0) { return []; } // 提取ID列表 var workItemIds = queryResult.workItems.map(item => item.id); // 指定需要的字段引用名(必须用系统标准引用名) var targetFields = ["System.Title", "System.CompletedWork"]; // 批量获取完整工作项数据 return queryClient.getWorkItems(workItemIds, targetFields, undefined, undefined); }) .then(function(workItems) { // 整理返回结果 return workItems.map(item => { return { id: item.id, title: item.fields["System.Title"], completedWork: item.fields["System.CompletedWork"], url: item.url }; }); }); }
2. 确认字段引用名正确
注意:WIQL里的字段要使用系统引用名,而不是显示名称。比如"Completed Work"对应的引用名是System.CompletedWork,如果误用显示名称可能导致字段无法被正确识别。你可以在Azure DevOps/TFS的工作项设置里查看每个字段的官方引用名。
小提示
- 如果是简单查询,方式一的
$expand=Fields更直接;如果需要多次复用ID列表,方式二更灵活。 - 记得处理空值情况,比如有些工作项可能未填写
Completed Work,要避免undefined引发的报错。
内容的提问来源于stack exchange,提问作者Journeyman1234
相关产品推荐
相关产品推荐

