类型错误:无法读取未定义的属性(读取“id”)

问题描述 投票:0回答:6

我的终端出现此错误:

类型错误:无法读取未定义的属性(读取“id”)

我正在尝试测试对 API 的调用,但出现错误。

我的功能:

itemToForm = () => {
    this.api.send(this.component, 'get',
        { lang: 'ES', filter: { id: this.item['id'] } }
    ).then(resEsp => {
        this.item = resEsp['data'][0];
        this.api.send(this.component, 'get',
            { lang: 'EN', filter: { id: this.item['id'] } }
        ).then(res => {
            let itemEng = res['data'][0];
            let fields = this.formDef.map(register => register.filter(
                field => field['register_table'].indexOf('traduction') !== -1
            ).map(
                field => field['field_name'])
            ).filter(register => register.length);

            fields = fields.length ? fields[0] : [];

            if (itemEng) {
                this.item = Object.keys(itemEng).reduce((obj, key) => {
                    obj[key] = this.item[key];
                    if (fields.indexOf(key) !== -1) {
                        obj[key + '_eng'] = itemEng[key];
                    }
                    return obj;
                }, {});
            }

            if (this.item) {
                this.setForm();
            }
        })
    })
}

我的规格文件:

it('should call api.send', () => {
    let spy1 = spyOn(api, 'send');
    let item = {
        id: 1,
        name: 'test',
    }

    component.addItem(item);
    component.itemToForm();

    expect(spy1).toHaveBeenCalled();
});
angular angularjs typescript karma-jasmine
6个回答
28
投票

发生了什么:

函数

itemToForm()
this.item
准备好之前被调用。

有很多策略可以避免这个错误。一个非常简单的策略就是在函数的开头添加一个捕获器,如下所示:

itemToForm = () => {
  if(this.item === undefined) {return}
         
  // The rest of the code
}

如果数据尚不存在,这将停止该功能。

一个更优雅的解决方案可能是按照操作顺序进一步向上,找到谁在调用

itemToForm()
并确保数据在调用之前存在。


14
投票

我碰到了这个问题,但我的问题实际上完全不同。

在我的代码中,由于某些原因,我有

import { SOME_OBJECT } from '.';

应该是这样的:

import { SOME_OBJECT } from './proper-file';

1
投票

尝试使用 npm install [path to module here] 安装本地 npm 模块时,出现错误

“无法读取未定义的属性(读取‘spec’)”。

问题的根源:我没有在其

package.json 文件中给本地模块命名。


1
投票
在我的例子中,错误是类似的,但我得到了不同的解决方案,因为我在 JavaScript 文件中使用了 body-parser 模块。

我必须补充一下

app.use(bodyParser.urlencoded({ extended: true }));
    

1
投票
Typescript 版本错误 在 package.json 中将 typescript 版本更改为,

“打字稿”:“3.8.3”

然后 npm 安装


0
投票
我遇到了同样的错误

TypeError: Cannot read properties of undefined (reading 'email')
此错误可能是由于以下原因之一造成的 - 

  1. 未定义的请求正文:如果 req.body 未定义或没有 email 属性,则尝试访问 req.body.email 将导致此错误。确保您的请求正文格式正确并包含电子邮件属性。

  2. 中间件排序:如果您使用中间件来解析请求正文

(e.g., express.json()),
确保它在路由处理程序之前应用。如果它在您的路由处理程序之后应用,则 req.body 可能在您的处理程序中未定义。

    不正确的路由处理:确保您的路由处理程序已正确设置以接收带有必要参数的请求。如果路由处理不正确,传递给控制器的 req 对象可能不具有预期的属性。
4.不正确的数据访问:仔细检查您的代码以确保您访问正确的对象和属性。例如,如果您尝试访问 req.body.email,请确保电子邮件嵌套在 body 下。

在我的代码中存在第二点提到的错误

之前

app.use("/api/v1/all", imageRoute); app.use("/api/v1/user", userRoute); app.use(express.json({ limit: "3mb" }));
之后

app.use(express.json({ limit: "3mb" })); app.use("/api/v1/all", imageRoute); app.use("/api/v1/user", userRoute);
谢谢

© www.soinside.com 2019 - 2024. All rights reserved.