You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:43:06