【问题标题】:azure-devops-node-api: Trouble calling queryByWiql() function with WIQL argumentazure-devops-node-api:使用 WIQL 参数调用 queryByWiql() 函数时遇到问题
【发布时间】:2020-08-13 04:03:40
【问题描述】:

这里的第一个问题。 我正在开发一个程序,该程序需要查询我的 azure devops 组织并返回由 System.Tag 和 System.TeamProject 过滤的工作项引用列表。

为此,我决定通过以下方式使用 azure-devops-node-api 的 queryByWiql() 函数:

//create a new WIQL object of data we want
const query: string = "SELECT [System.Id] FROM WorkItems WHERE [System.TeamProject] = [" + this.globals.API_PROJECT + "] AND [System.Tags] Contains [" + tag + "]";
console.log(query);

//create a new TeamContext object so the query knows where to look
const projectId = this.globals.API_PROJECT;

//ping ADO with this query
const result: WorkItemTrackingInterfaces.WorkItemQueryResult = await WorkItemApiObject.queryByWiql({query: query}, {project: projectId}); //WHY DOESNT THIS WORKKKKKK

其中 'this.globals.API_PROJECT' 是引用项目名称的字符串,而 'tag' 是我要查询工作项的标签名称的字符串。

问题是,当我使用参数 'this.globals.API_PROJECT' = projectName 和 'tag' = tagName 调用 queryByWiql() (只是随机参数:无论如何我都会收到相同的错误消息),我得到以下信息错误:

Failed to load resource: the server responded with a status of 400 () from dev.azure.com/{organization}/{project}/_apis/wit/wiql:1
ERROR Error: Uncaught (in promise): Error: TF51005: The query references a field that does not exist. The error is caused by «projectName».
at RestClient.<anonymous> (RestClient.js:202)
at Generator.next (<anonymous>)
at fulfilled (RestClient.js:6)
at ZoneDelegate.invoke (zone-evergreen.js:364)
at Object.onInvoke (core.js:27148)
at ZoneDelegate.invoke (zone-evergreen.js:363)
at Zone.run (zone-evergreen.js:123)
at zone-evergreen.js:857
at ZoneDelegate.invokeTask (zone-evergreen.js:399)
at Object.onInvokeTask (core.js:27136)
at resolvePromise (zone-evergreen.js:798)
at zone-evergreen.js:705
at rejected (tslib.es6.js:72)
at ZoneDelegate.invoke (zone-evergreen.js:364)
at Object.onInvoke (core.js:27148)
at ZoneDelegate.invoke (zone-evergreen.js:363)
at Zone.run (zone-evergreen.js:123)
at zone-evergreen.js:857
at ZoneDelegate.invokeTask (zone-evergreen.js:399)
at Object.onInvokeTask (core.js:27136)

问题是,我知道 projectName 和 tagName 存在于我正在查询的项目和组织中。我也知道我使用了对这些字段“System.Tag”和“System.TeamProject”的正确引用,因为我专门检查了我的项目。

我想要做的就是从此调用中获取类型 WorkItemTrackingInterfaces.WorkItemQueryResult。请帮忙!感谢您的宝贵时间。

EDIT1:添加了资源加载失败错误消息,因为这也会发生。

【问题讨论】:

  • 是的,我有。括号是必要的,因为我的组织中有一些项目和标签使用空格和特殊字符,括号让 API 知道这些字符仍然是标签/项目名称的一部分。无论如何,即使没有括号,错误仍然是一样的。不过问题很好
  • 更新:我错了。下面回答

标签: typescript azure-devops tags wiql


【解决方案1】:

我建议您尝试一下市场扩展,Wiql Editor。它可以让你玩转语法和查询结果。

我只是模拟了一些东西,正如我所预料的那样,用 [ ] 包裹似乎会导致它认为您引用的是字段而不是文字。至少错误消息看起来是一样的。

没有..

【讨论】:

  • 你完全正确。正如您发布的那样,我想通了(好吧,我的老板想通了)。还是非常感谢!我很感激。
【解决方案2】:

更新: 我修好了它。不这样做我觉得很傻。结果我误解了 WIQL 中的括号 [] 应该是什么——它们只应该代表字段。要使用空格和特殊字符表示字符串,请用 '' 将字符串括起来,如下所示:

const query: string = "SELECT [System.Id] FROM WorkItems WHERE [System.TeamProject] = '" + this.globals.API_PROJECT + "' AND [System.Tags] Contains '" + tag + "'";

...是的,原来这一直是语法错误。我觉得很傻哈哈。我花了这么多时间哈哈

【讨论】:

    猜你喜欢
    • 2011-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多