-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)"
}
당신이 보여줄 수 더? 사용자를 인스턴스화하는 것을 보지만이 방법을 사용하지 마십시오. – ndugger
ndugger가 말한 것에 덧붙여, Javascript에서'this'의 값은 호출하는 방법을 너무 중요하게하여 호출 사이트를 표시하는 방법에 달려 있습니다. – hugomg
'Invoke' 메소드에서'GetUsers'를 호출하려고합니다. 'let res = await api (fReq.Request); ' –