2016-07-02 5 views
-1

자바 스크립트에서 ''정의되지 않은 항목 '속성을 읽을 수 없습니다.'오류가 발생합니다. this 키워드는 클래스의 항상 undefined입니다.javascript/typescript 오류가 발생합니다. '정의되지 않은 항목'을 읽을 수 없습니다.

이 문제를 해결하는 방법은 무엇입니까? express 라우터에서 사용하는 static 방법에 문제가 있습니까?

Typescript 컴파일 옵션이 ES6을 가리키고 있습니다.

import * as express from 'express'; 
import {Router, Request, Response, NextFunction, Wrap } from '../../../Core'; 
import {FacadeRequest} from '../../../Common'; 

class Base { 
    public Items: any = { Name: 'Natarajan Ganapathi' }; 
    public Get(): any { 
     return this.Items; 
    } 
} 

class User extends Base { 
    public GetUsers(): any { 
     return super.Get(); 
    } 
} 

export type BoRegistry = { [key: string]:() => any }; 

export class Facade { 
    public static BoRegistry: BoRegistry = {}; 
    public static async GetData(req: Request, res: Response, next: NextFunction): Promise<any> { 
     let promises: Array<any> = []; 
     let reqs = req.body as Array<FacadeRequest>; 
     reqs.forEach(fReq => { 
      let route = Facade.ParseRoute(fReq.Route); 
      let func = Facade.BoRegistry[route.BoName]; 
      if (!func) { 
       throw new Error(route.BoName + ' not register in BoRegistry'); 
      } 
      let bo = func(); 
      promises.push(Facade.Invoke(bo, route, fReq)); 
     }); 
     return await Promise.all(promises); 
    } 

    private static async Invoke(bo: any, route: { BoName: string, MethodName: string }, fReq: FacadeRequest): Promise<any> { 
     let api = bo[route.MethodName]; 
     if (!api) { 
      throw new Error(route.MethodName + ' is not available in ' + route.BoName); 
     } 
     let res = await api(fReq.Request); 
     return { [fReq.Key]: res }; 
    } 

    private static ParseRoute(route: string): { BoName: string, MethodName: string } { 
     let r = route.split('/'); 
     if (r.length < 2 || r.length > 2) { 
      throw new Error('Request contains improper route'); 
     } 
     return { BoName: r[0], MethodName: r[1] }; 
    } 
} 

Facade.BoRegistry['User'] =() => new User(); 

let router: Router = express.Router(); 
router.post('/' + Facade.GetData.name, Wrap(Facade.GetData)); 
export default router; 
{ 
"Message": "Cannot read property 'Items' of undefined", 
"Stack": "TypeError: Cannot read property 'Items' of undefined\n  
at Get (/Users/dist/dev/Server/Modules/Base/Router/Facade.js:17:20)\n  
at GetUsers (/Users/dist/dev/Server/Modules/Base/Router/Facade.js:22:22)\n  
at Function.<anonymous> (/Users/dist/dev/Server/Modules/Base/Router/Facade.js:48:29)\n  
at next (native)\n at __awaiter (/Users/dist/dev/Server/Modules/Base/Router/Facade.js:7:65)\n  
at __awaiter (/Users/dist/dev/Server/Modules/Base/Router/Facade.js:3:12)\n  
at Function.Invoke (/Users/dist/dev/Server/Modules/Base/Router/Facade.js:43:16)\n  
at Base.static.GetData.reqs.forEach.fReq (/Users/dist/dev/Server/Modules/Base/Router/Facade.js:37:38)\n  
at Array.forEach (native)\n  
at /Users/dist/dev/Server/Modules/Base/Router/Facade.js:30:18\n  
at next (native)\n at __awaiter (/Users/dist/dev/Server/Modules/Base/Router/Facade.js:7:65)\n  
at __awaiter (/Users/dist/dev/Server/Modules/Base/Router/Facade.js:3:12)\n  
at GetData (/Users/dist/dev/Server/Modules/Base/Router/Facade.js:27:16)\n  
at exports.Wrap (/Users/dist/dev/Server/Core/Core.js:70:16)\n  
at Layer.handle [as handle_request] (/Users/node_modules/router/lib/layer.js:93:5)" 
} 
+2

당신이 보여줄 수 더? 사용자를 인스턴스화하는 것을 보지만이 방법을 사용하지 마십시오. – ndugger

+1

ndugger가 말한 것에 덧붙여, Javascript에서'this'의 값은 호출하는 방법을 너무 중요하게하여 호출 사이트를 표시하는 방법에 달려 있습니다. – hugomg

+0

'Invoke' 메소드에서'GetUsers'를 호출하려고합니다. 'let res = await api (fReq.Request); ' –

답변

관련 문제