You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用homepageHandler时报错TypeError:Cannot read properties of undefined

问题:测试Jest时出现TypeError: Cannot read properties of undefined (reading 'homepageHandler')

控制器代码 (controllers/index.js)

var indexExports = module.exports = {
  
  homepageHandler: function (req, res) {
    console.log(`index page. Req ${req}`);
    return res.status(200).json({
      "message": "welcome"
    });
  }
}

测试代码

const dotenv = require('dotenv');
const request = require("supertest")
var indexControllerModule = require('../controllers/index');


beforeAll(async () => {
  dotenv.config();
  console.log(`Ensure both Mongo and Express is running before running these tests`);
});

describe("Endpoints are accessible", () => {
    it("GET request for homepage should return 200", async () => {
      const baseURL = process.env.EXPRESS_SERVER_TEST 
      console.log(`base url is ${baseURL}`);
      const req = {};
      const res = {
        status: jest.fn(),
        json: jest.fn(),
      }
      indexControllerModule.indexExports.homepageHandler(req,res)
      .then((result)=>{
        console.log(`result is ${result}`);
        expect(1).toBe(1);
      })
      .catch((error)=>{
        console.log(`error in accessing homepage: ${error}`);
      })
    });  
});

报错信息

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

      18 |         json: jest.fn(),
      19 |       }
    > 20 |       indexControllerModule.indexExports.homepageHandler(req,res)
         |                                          ^
      21 |       .then((result)=>{
      22 |         console.log(`result is ${result}`);
      23 |         expect(1).toBe(1);
问题原因与修复方案

核心问题

你在控制器中直接把包含homepageHandler的对象赋值给了module.exports,同时用indexExports变量引用了这个对象。但导入模块后,indexControllerModule本身就是你导出的那个对象,它并没有indexExports这个属性,所以会触发读取未定义属性的错误。

修复方式(二选一)

方式1:修改测试代码的调用逻辑

直接通过导入的模块访问homepageHandler即可:

// 替换测试中的调用行
indexControllerModule.homepageHandler(req, res)

方式2:修改控制器的导出结构(可选)

如果需要保留indexExports变量,可以把导出改成嵌套结构:

var indexExports = {
  homepageHandler: function (req, res) {
    console.log(`index page. Req ${req}`);
    return res.status(200).json({
      "message": "welcome"
    });
  }
};
module.exports = { indexExports };

这种情况下测试代码无需修改,但更推荐方式1,符合Node.js模块导出的常规写法,避免多余嵌套。

额外优化建议

你的homepageHandler没有返回Promise,测试中使用.then()没有实际意义。可以直接调用后断言响应方法是否被正确调用,让测试更有价值:

indexControllerModule.homepageHandler(req, res);
expect(res.status).toHaveBeenCalledWith(200);
expect(res.json).toHaveBeenCalledWith({ message: "welcome" });

内容的提问来源于stack exchange,提问作者Manu Chadha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 17:22:44