Я получаю сообщение об ошибке« Невозможно прочитать свойство «Элементы неопределенного» в javascript. this
ключевое слово всегда undefined
в классе Base
.получение ошибки javascript/typescript «Невозможно прочитать свойство« Элементы неопределенного »
как решить эту проблему? Есть ли проблема с использованием метода static
для использования в маршрутизаторе express
?
Опция компиляции машинописных имен указывает на 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)"
}
Можете ли вы показать, где вы на самом деле вызова GetUsers? Я вижу, что вы создаете экземпляр пользователя, но никогда не используете этот метод. – ndugger
Добавляя к тому, что сказал ndugger, значение 'this' в Javascript зависит от того, как вы называете ваши методы, поэтому важно показать сайты вызовов. – hugomg
Я вызываю 'GetUsers' из метода' Invoke'. строка 'let res = await api (fReq.Request);' –