2016-06-20 26 views
0

我從前開發人員繼承了一個應用程序,並且我幾乎耗盡了所有的調試功能。這個應用程序是我第一次接觸到Typescript,所以我在那裏感覺有點失落。我也無法找到有關這個StackOverflow上任何一個已經發布,所以這裏是我的問題:Typescript + C#+ Angular - Response與配置的參數不匹配

我有一個名爲「任務」的實體,其在C定義的#如下:

public class Task : ModelBase 
{ 
    public Task() 
    { 
     FiscalYears = new List<TaskFy>(28); 
     Flags = new List<TaskFlags>(); 
    } 

    [Required, AuditField("Project", typeof(Project))] 
    public Guid Project_Id { get; set; } 
    public virtual Project Project { get; set; } 

    public Guid ScenarioId { get; set; } 

    [AuditField("Active Status")] 
    public bool IsActive { get; set; } 

    [RegularExpression(@"^[A-z0-9]+$", ErrorMessage = "A Task # must be alphanumeric.")] 
    [Required, MaxLength(4), AuditField("Task Name"), AuditDisplay] 
    public string TaskName { get; set; } 

    [Required, MaxLength(100), AuditField("Title")] 
    public string Title { get; set; } 

    [AuditField("Description")] 
    public string Description { get; set; } 

    [AuditField("ATO", typeof(Dropdown))] 
    public Guid TaskAto_Ident { get; set; } 
    public virtual Dropdown Ato { get; set; } 

    [AuditField("DTO", typeof(Dropdown))] 
    public Guid? DtoId { get; set; } 
    public virtual Dropdown Dto { get; set; } 

    [AuditField("Performer", typeof(Performer))] 
    public Guid Performer_Id { get; set; } 
    public virtual Performer Performer { get; set; } 

    //<snip, several string fields here> 

    public virtual List<TaskFy> FiscalYears { get; set; } 
    public virtual List<Workpackage> Workpackages { get; set; } 
    public virtual List<TaskFlags> Flags { get; set; } 
} 

當一個任務被請求,被返回的任務不是null,它實際上是一個完全有效的任務(通過調試確認)。我也有定義打字稿這裏:

export interface ITask extends ng.resource.IResource<ITask> { 
    id: string; 
    projectId: string; 
    isActive: boolean; 
    taskName: string; 
    title: string; 
    description: string; 
    ato: IDropdown; 
    atoId: string; 
    dto: IDropdown; 
    dtoId: string; 
    performerId: string; 
    performer: IPerformer; 
    //<snip, same string fields here> 
    fiscalYears?: ITaskFy[]; 
} 

taskCtrl.ts如下:

export default class TasksCtrl { 
static $controllerAs = 'p'; 
private isEditing: boolean; 
private taskId: string; 
private item: ITask; 
private children: IByFlagsResult[]; 
private flags: ITaskFlags; 
private objective: ITaskObjective; 
private tso: IPoc; 
private poc: ITaskPerformingOrg; 
private fyStartYear: number; 

static $inject = ['$stateParams', '$state', '$modal', 'Task', 'TaskFlags', 'TaskObjective', 
    'TaskPerformingOrg', 'Toast', 'Login', 'KeyGen', 'fyStartYear', 'taskInfo', 'dropdowns']; 
constructor(private $stateParams: ITaskParams, private $state: ng.ui.IStateService, 
    private $modal: ng.ui.bootstrap.IModalService, private task: ITaskResource, 
    private taskFlags: ITaskFlagsResource, private taskObjective: ITaskObjectiveResource, 
    private taskPerformingOrg: ITaskPerformingOrgResource, private toast: IToast, 
    private login: ILogin, private keygen: IKeyGen, 
    fyStartYear: number, taskInfo: ITaskResolveResults, private dropdowns: any) { 

    this.item = taskInfo.task; 
    this.children = this.keygen.convertTreeToLinkElements(taskInfo.children, 'workpackage'); 
    this.flags = taskInfo.flags; 
    this.objective = taskInfo.objectives; 
    this.tso = taskInfo.tso; 
    this.poc = taskInfo.poc; 
    this.isEditing = taskInfo.isEditing; 
    this.taskId = this.item.id; 
    this.fyStartYear = fyStartYear; 
} 
//<snip, other methods here> 

這裏有個致命的 - 我有這個項目的兩個版本。還有舊的回購和新的回購(舊的回購與一個Java應用程序混在一起,在一個回購中太麻煩)。如果我嘗試運行新版本的回購,然後我最終得到

Error in resource configuration for action `get`. Expected response to contain an object but got an array (Request: {3} {4}) 

在控制檯當我嘗試查看任務。如果我在運行新的回購代碼時打開舊回購代碼所有事情都剛剛開始工作,但我所做的更改(至HTML)未顯示。直到我關閉Visual Studio中的新回購之後,此更改纔會繼續。

第二誤差伴隨在控制檯第一:

TypeError: Unable to get property 'task' of undefined or null reference 

指向在該行

this.flags = taskInfo.flags; 

調試這表明TASKINFO本身是空。這可能是上述錯誤的後果,但我認爲這可能會有所幫助。

如果您需要任何進一步的信息或代碼,請讓我知道。

謝謝你看!

編輯:

我已經縮小我的問題到打字稿以下塊:

if ($stateParams.taskId) { 
      return task.getByName({ 
       id: $stateParams.taskId, 
       projectName: $stateParams.projectId, 
       peName: $stateParams.peId, 
       pcName: $stateParams.pcId, 
       scenarioId: login.scenario.id 
      }).$promise.then((retrievedTask: ITask) => { 
       var flags = task.getFlags({ id: retrievedTask.id }).$promise.catch(() => []); 
       var objectives = taskObjective.query({ id: retrievedTask.id }).$promise.catch(() => { 
        return new taskObjective({ taskId: retrievedTask.id }).$save(); 
       }); 
       var pOrgs = taskPerformingOrg.getByTask({ id: retrievedTask.id }).$promise.catch(() => { 
        return new taskPerformingOrg({ taskId: retrievedTask.id }).$save(); 
       }); 
       var tso = project.get({ id: retrievedTask.projectId }).$promise.then((project: IProject) => { 
        return poc.query({ id: project.pocId }).$promise.catch(() => {}); 
       }); 
       var children = workpackage.getByParent({ parentId: retrievedTask.id, scenarioId: login.scenario.id }).$promise.catch(() => [{"error":"Error"}]); 

       return $q.all([flags, objectives, pOrgs, tso, children]).then(
        (<any>_).spread((flags: ITaskFlags, objectives: ITaskObjective, 
         poc: ITaskPerformingOrg, tso: IPoc, children: ITreeNode[]) => { 

         visit.createVisit({ itemType: ReportLevel.Task, itemId: retrievedTask.id, scenarioId: login.scenario.id }); 

         angular.extend(promiseResults, { 
          isEditing: true, 
          task: retrievedTask, 
          children: children, 
          flags: flags, 
          objectives: objectives, 
          poc: poc, 
          tso: tso 
         }); 

         return promiseResults; 
        }) 
        ).catch((err: any) => console.log(err)); 
      }).catch(() => { 
       promiseResults.task = <ITask> { id: '404' }; 
       return promiseResults; 
      }); 

具體來說,發生故障的線路似乎是:

return $q.all([flags, objectives, pOrgs, tso, children]).then(
        (<any>_).spread((flags: ITaskFlags, objectives: ITaskObjective, 
         poc: ITaskPerformingOrg, tso: IPoc, children: ITreeNode[]) => 
+0

您的依賴關係可能會發生變化,NuGet依賴關係或其他。在那裏很難幫到你。不過,我以前看過這個錯誤。這通常是因爲1)您的WebAPI端點正在返回IEnumerable而不是對象,或者2)您的路由由於請求中傳遞的錯誤/缺少參數或錯誤的路由配置而被錯誤地命中。使用Fiddler調試確切的請求,查看它正在觸發哪個端點(WebAPI控制器函數),並驗證它沒有返回IEnumerable。如果是的話,你可以從那裏調試。 –

+0

WebAPI控制器功能正在被適當打擊,並且正在返回單個任務。依賴角度很有趣,我有舊的代碼庫,(如果我知道在哪裏看,以及如何去做)可能會恢復到這些版本。 –

+0

然後,響應主體應包含在{...}中,而不是[{...}]。我相信Angular的$資源服務正在檢測[]這個錯誤的含義。可能是錯誤的,我不知道TypeScript是如何改變的。 –

回答

0

找到了問題是什麼。事實證明,我從C#實體中刪除了Dto字段和DtoId字段,但未將它們從Typescript定義中刪除。如果您遇到同樣的問題,我強烈建議您逐行查看您的實體定義並嘗試確定是否缺少某些內容。