I'm getting following error when creating bug item in TFS 2015.2 (on premise) via vso-node-api package, however same code is working perfectly in my VSTS (online) subscription.
Error: Failed Request: Bad Request(400) - TF401349: An unexpected error has occurred, please verify your request and try again.
Status Code: 400
I'm using the WorkItemTrackingApi/createWorkItem function in vso-node-api library to create the work item. Following is the sample code I have used to create work items.
WorkItemCreator.ts
import * as vm from 'vso-node-api/WebApi';
import * as wa from 'vso-node-api/WorkItemTrackingApi';
import * as wi from 'vso-node-api/interfaces/WorkItemTrackingInterfaces';
import * as vss from 'vso-node-api/interfaces/Common/VSSInterfaces';
import * as core from 'vso-node-api/interfaces/CoreInterfaces';
import tl = require('vsts-task-lib/task');
export class WorkItemCreator {
workItemType: string = "Bug";
fieldsToRetrieve: string[] = ["System.State", "System.Title"];
collectionUrl: string;
projName: string;
accessToken: string;
vstsWI: wa.IWorkItemTrackingApi;
projectId: string;
constructor() {
console.log("Initializing Workitem Creator...");
console.log("Retrieving enviornment values...");
this.collectionUrl = process.env["SYSTEM_TEAMFOUNDATIONCOLLECTIONURI"];
this.projName = process.env["SYSTEM_TEAMPROJECT"];
this.projectId = process.env["SYSTEM_TEAMPROJECTID"];
console.log("SYSTEM_TEAMFOUNDATIONCOLLECTIONURI: " + this.collectionUrl);
console.log("SYSTEM_TEAMPROJECT: " + this.projName);
this.accessToken = this.getAccessToken();
let creds = vm.getBearerHandler(this.accessToken);
let connection = new vm.WebApi(this.collectionUrl, creds);
this.vstsWI = connection.getWorkItemTrackingApi();
}
/**
* Create Work Items
*/
public createWorkItems(workItems: Array<BugItem>) {
workItems.forEach(workItem => {
let selectWorkItemsQry = { query: "Select [System.Id] From WorkItems Where [System.WorkItemType] = '" + this.workItemType + "' AND [System.Title] = '" + workItem.title + "'" };
this.getWorkitem(this.projName, this.projectId, selectWorkItemsQry).then((qr: wi.WorkItemQueryResult) => {
console.log("WorkItem Count:" + qr.workItems.length);
if (qr.workItems.length == 0) {
console.log("Creating WorkItem '" + workItem.title + "' in project '" + this.projName + "'");
let xs: string[] = ["TagX", "TagY", "TagZ"];
console.log("Tags: " + xs);
this.createWorkitem(this.projName, this.workItemType, workItem.title, workItem.description, workItem.severity, xs);
}
})
.catch((e) => {
console.error("Failed to retrieve WorkItem by title '" + workItem.title + "' Error: " + e);
});
});
}
//Get acces token
private getAccessToken(): string {
tl.debug("Getting credentials for local feeds");
let auth = tl.getEndpointAuthorization("SYSTEMVSSCONNECTION", false);
if (auth.scheme === "OAuth") {
console.log("Token retrieved: " + auth.parameters["AccessToken"]);
tl.debug("Token retrieved: " + auth.parameters["AccessToken"]);
return auth.parameters["AccessToken"];
}
else {
tl.warning("Could not retrieve authentication token for Workitem creation.");
}
}
//Create Workitem
private createWorkitem(projectName: string, witype: string, title: string, description: string, severity: string, tagsCollection: string[]) {
let wijson: vss.JsonPatchDocument = [
{ "op": "add", "path": "/fields/System.Title", "value": title },
];
this.vstsWI.createWorkItem(null, wijson, projectName, witype, null, null).then((workitem: wi.WorkItem) => {
console.log("WorkItem '" + workitem.id + "' Created");
}).catch((e) => {
console.error("Failed to create work item for '" + title + "' Error: " + e);
});
}
/**
* Get Workitems
*/
private getWorkitem(projectName: string, teamProjectId: string, wiqlQuery: wi.Wiql): Promise<wi.WorkItemQueryResult> {
console.log(wiqlQuery.query);
let teamContext: core.TeamContext = { project: projectName, projectId: teamProjectId, team: "", teamId: "" };
return this.vstsWI.queryByWiql(wiqlQuery, teamContext, null, null);
}
}
/**
* BugItem
*/
export class BugItem {
title: string;
description: string;
severity: string;
constructor(title: string, description: string, severity: string) {
this.title = title;
this.description = description;
this.severity = severity;
}
}
App.ts
/// <reference path="../definitions/node.d.ts" />
/// <reference path="../definitions/minimatch.d.ts" />
const Critical = "1 - Critical";
const Low = "4 - Low";
import * as wIc from './WorkItemCreator';
var x = new wIc.WorkItemCreator();
var fullCollection = new Array<wIc.BugItem>();
var itm1 = new wIc.BugItem("Bug1TitleItem1", "DescriptionCritical", Critical);
fullCollection.push(itm1);
var itm6 = new wIc.BugItem("Bug1TitleItem6","DescriptionLow",Low);
fullCollection.push(itm6);
x.createWorkItems(fullCollection);
console.log("End.");
Scopes: "scopes": [ "vso.build_execute", "vso.work_write" ],