require带大括号与普通require的区别及调用失败原因咨询
两种require写法的区别及报错原因分析
写法区别
第一种写法
const authController = require("../controller/authController");
- 直接将目标模块导出的全部内容赋值给
authController变量。无论模块用module.exports导出单个对象/函数,还是用exports挂载多个属性,这个变量都会直接指向模块的最终导出结果。
第二种写法
const { authController } = require("../controller/authController");
- 这是ES6对象解构赋值语法,意思是从模块导出的对象中,提取名为
authController的属性并赋值给同名变量。如果模块导出的对象里不存在这个属性,变量会变成undefined。
报错原因
你调用authController.createUser报错,核心原因是你的authController.js模块导出结构和第二种写法不匹配:
- 假设你的模块是这样导出的:
此时模块导出的对象里并没有// authController.js module.exports = { createUser: () => { /* 业务逻辑 */ }, login: () => { /* 业务逻辑 */ } }authController这个属性,解构后authController变量为undefined,调用undefined.createUser就会触发Cannot read properties of undefined (reading 'createUser')错误。 - 而第一种写法中,
authController直接指向模块导出的整个对象,所以authController.createUser可以正常调用。
只有当模块导出结构包含authController属性时,第二种写法才有效,比如:
// authController.js module.exports = { authController: { createUser: () => { /* 业务逻辑 */ }, login: () => { /* 业务逻辑 */ } } }
内容的提问来源于stack exchange,提问作者barankibar
相关产品推荐
相关产品推荐

