2016-06-20 7 views
0

以前の開発者からアプリを継承しましたが、私はすべてのデバッグ能力を使い果たしました。このアプリはTypescriptへの私の最初の露出なので、私はそこにも少し失われている気がします。また、私はそうここに私の問題だ、掲載されていますStackOverflowの上でこれに関連する何かを見つけることができません。Typescript + C#+ Angular - レスポンスが設定されたパラメータと一致しません

私はその定義が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> 

は、ここでこするだ - 私はこのプロジェクトの2つのバージョンがあります。古いレポと新しいレポがあります(古いレポはJavaアプリケーションと一緒にマッシュされていましたが、1つのレポで扱いにくい)。新しいレポバージョンを実行しようとすると、タスクを表示しようとするとコンソールに

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

が終了します。新しいリポジトリコードが実行されている間に古いリポジオを開いた場合すべてが機能し始めただけですが、(htmlに)行った変更は表示されません。この変更は、Visual Studioで新しいリポジトリを閉じるまで維持されます。

第2のエラーがコンソールに最初に付属:

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

このtaskInfoがヌル自体であることを示してデバッグラインで

this.flags = taskInfo.flags; 

ポインティング。これはおそらく上記のエラーの結果ですが、私はそれが言及することは有益であると考えました。

詳細情報やコードが必要な場合は、私にお知らせください。

ありがとうございます!

EDIT:

私は活字体の次のブロックまで私の問題を縮小している:

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

何が問題なの?私はDtoフィールドとDtoIdフィールドをC#エンティティから削除しましたが、Typescript定義から削除しませんでした。同じ問題を抱えている場合は、エンティティ定義で1行ずつ探して、何かが欠けているかどうかを判断することを強くお勧めします。

関連する問題