得到javascript/typescript错误“无法读取未定义的属性'Items'"; [英] getting javascript/typescript error "Cannot read property 'Items' of undefined"

查看:302
本文介绍了得到javascript/typescript错误“无法读取未定义的属性'Items'";的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在JavaScript中收到错误无法读取未定义的属性'Items'". this关键字在Base类中始终为undefined.

I am getting an error "Cannot read property 'Items' of undefined" in javascript. this keyword is always undefined in the Base class.

如何解决此问题?在express路由器中使用的static方法是否存在任何问题?

how to resolve this issue? Is there any issue with static method to use in express router?

Typescript编译选项指向ES6.

Typescript compile option is pointing to 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)"
 }

推荐答案

无法读取未定义的属性'Items',

"Cannot read property 'Items' of undefined",

常见的JavaScript错误.您需要注意使用this或仅使用箭头功能.

Common JavaScript error. You need to be cautions of your usage of this or just use an arrow function.

https://basarat.gitbooks.io/typescript/content/docs/arrow-functions.html

这篇关于得到javascript/typescript错误“无法读取未定义的属性'Items'";的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆