开玩笑:无法读取未定义的属性(读取“0”)

Posted

技术标签:

【中文标题】开玩笑:无法读取未定义的属性(读取“0”)【英文标题】:Jest: Cannot read properties of undefined (reading '0') 【发布时间】:2022-01-18 20:39:17 【问题描述】:

我是开玩笑的新手,我已经进行了测试以检查从 url 对数据库的多次调用。

我用这个命令运行测试:

npx jest --watchAll file.test.js

一切正常。但是,如果我修改逗号,例如,测试会再次运行并且我有错误。我没有任何来自 api 的“OK”,而且我也遇到了这个错误:

TypeError: Cannot read properties of undefined (reading '0')

当我尝试检查我收到的内容是否符合我的预期时,就像我们在这一行中看到的那样:

expect(1).toBe(result.data[0].id);

如果我停止测试并再次运行:npx jest --watchAl file.test.js 一切正常。

发生了什么?为什么测试运行两次时出现这些错误?

我的测试代码是:

import config from "../config";
import getData from "../com/functions";

describe("Test several connections with Postgress making a request via POST", () => 
    describe("Test read data from database", () => 
        test("Test 1: Read data from tbl001_users", async () => 
            let data = 
                "query": 1,
                "origin": "Mapping-Service"
            ;
    
            let result = await getData(`$config.backend.protocol://$config.backend.domain:$config.backend.port/api/youmalou`, data);
            console.log(result);
            expect(1).toBe(result.data[0].id);
            expect("OVT").toBe(result.data[0].code);
            expect(2).toBe(result.data[1].id);
            expect("TTHOT").toBe(result.data[1].code);
        );
        test("Test 2: Read data from tbl001_users", async () => 
            let data = 
                "query": 1,
                "origin": "Mapping-Service"
            ;
    
            let result = await getData(`$config.backend.protocol://$config.backend.domain:$config.backend.port/api/youmalou`, data);
            expect(1).toBe(result.data[0].id);
            expect("OVT").toBe(result.data[0].code);
            expect(2).toBe(result.data[1].id);
            expect("TTHOT").toBe(result.data[1].code);
        );
        test("Test 3: Read data from tbl001_users", async () => 
            let data = 
                "query": 1,
                "origin": "Mapping-Service"
            ;
    
            let result = await getData(`$config.backend.protocol://$config.backend.domain:$config.backend.port/api/youmalou`, data);
            expect(1).toBe(result.data[0].id);
            expect("OVT").toBe(result.data[0].code);
            expect(2).toBe(result.data[1].id);
            expect("TTHOT").toBe(result.data[1].code);
        );
        test("Test 4: Read data from tbl002_suppliers", async () => 
            let data = 
                "query": 2,
                "params": ["OVT"],
                "origin": "Mapping-Service"
            ;
    
            let result = await getData(`$config.backend.protocol://$config.backend.domain:$config.backend.port/api/youmalou`, data);
            expect("OK").toBe(result.result);
            expect(1).toBe(result.data.length);
        );
        test("Test 5: Read data from tbl002_suppliers", async () => 
            let data = 
                "query": 2,
                "params": ["OVT"],
                "origin": "Mapping-Service"
            ;
    
            let result = await getData(`$config.backend.protocol://$config.backend.domain:$config.backend.port/api/youmalou`, data);
            expect("OK").toBe(result.result);
            expect(1).toBe(result.data.length);
        );
        test("Test 6: Read data from tbl002_suppliers", async () => 
            let data = 
                "query": 2,
                "params": ["OVT"],
                "origin": "Mapping-Service"
            ;
    
            let result = await getData(`$config.backend.protocol://$config.backend.domain:$config.backend.port/api/youmalou`, data);
            expect("OK").toBe(result.result);
            expect(1).toBe(result.data.length);
        );
    );
);

我发送请求的文件有这个代码:

import express from "express";
import getData from "../com/functions";
import config from "../config";
import cors from "cors";
import YoumalouDDBB from "../database/Youmalou/youmalou_ddbb";


const router = express.Router();

const ddbb = new YoumalouDDBB();
async function start()
    await ddbb.connect();


start();

let url = null;
let urls = null;

if ((config.node_env === "test") || (config.node_env === "development") ||  (config.node_env === "production"))
    url = `$config.frontend.protocol://$config.frontend.domain:$config.frontend.port`;
    urls = `$config.frontend.protocols://$config.frontend.domain:$config.frontend.port`;


const corsOptions = 
    origin: [url, urls],
    optionSuccessStatus: 200,
    methods: ["POST", "OPTIONS"],
;

if ((config.node_env === "test") || (config.node_env === "development") || (config.node_env === "production"))
    router.all("*", cors(corsOptions));


router.post("/api/youmalou", async(req, res)=> 
    let result = null;
    

    if (typeof(req.body.query) === "number")
        console.log(req.body);
        result = await ddbb.getDataFromDDBB(req.body.query, req.body.params);
    

    res.json(result.data);
);

module.exports.Router = router;

【问题讨论】:

【参考方案1】:

我找到问题了!!!我也安装了 nodemon 模块。因此,每次我修改代码时,服务器都会重新启动。

发生了什么?当我重新运行测试时,服务器没有达到 100%,因此我的请求中有错误。

代码是正确的,并且在服务器之前启动时一切正常。

【讨论】:

以上是关于开玩笑:无法读取未定义的属性(读取“0”)的主要内容,如果未能解决你的问题,请参考以下文章

“无法读取未定义的属性”错误消息是不是已更改?

next-i18next 单元测试错误“无法读取未定义的属性语言”,带有链接和玩笑

如何使用自定义错误消息捕获“TypeError:无法读取未定义的属性(读取'0')”?

为啥 TypeError:无法读取未定义的属性“0”?

收到此错误:无法读取未定义的属性“0”

TypeError:使用状态时无法读取未定义的属性“0”