【问题标题】:getting javascript/typescript error "Cannot read property 'Items' of undefined"获取 javascript/typescript 错误“无法读取未定义的属性‘项目’”
【发布时间】:2016-11-04 10:46:57
【问题描述】:

我在 javascript 中收到错误“无法读取未定义的属性‘项目’”。 this 关键字在 Base 类中始终为 undefined

如何解决这个问题?在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)"
 }

【问题讨论】:

  • 您能显示您实际调用 GetUsers 的位置吗?我看到你实例化了一个用户,但从不使用这种方法。
  • 除了 ndugger 所说,Javascript 中 this 的值取决于您如何调用方法,因此显示调用站点也很重要。
  • 我从Invoke 方法调用GetUsers。线let res = await api(fReq.Request);

标签: javascript express typescript ecmascript-6


【解决方案1】:

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

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

更多

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

【讨论】:

    猜你喜欢
    • 2020-06-16
    • 1970-01-01
    • 2023-01-15
    • 2015-10-26
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 2022-01-22
    • 2021-02-22
    相关资源
    最近更新 更多