前言
如题所示,这是我今天写代码时遇到的一个问题,这其中涉及到了一些关于module.exports和exports的“恩怨情仇”,接下来让我来带大家好好捋一捋。
问题代码
//该路由负责用户注册和登录
//导入第三方模块
const express = require('express')
const router = express.Router()
//导入自定义模块
const router_handler = require('../router_handler/user')
router.post('/register',router_handler.regUser)
//导出路由
// exports = router
module.exports = router
在这段代码中,我原先一开时导出模块用的是
exports = router
结果就报了标题所示的错误,后来改成
module.exports = router
报错解决
那这其中的深层原因是什么呢,我记得学nodejs的时候不是说这二者在有些时候是指向同一个对象的吗,但好像也说过二者不完全等同,那究竟什么时候可以混用,什么时候只能用module.exports 呢,接下来分几种情况来讨论讨论。
分类
1.导出的是一个对象
前面已经展示过了,导出的router是一个对象,如果用exports导出就会报错,网上的说法是“导出一个对象时,通常使用module.exports。这是因为如果直接重新赋值给exports,会断开exports和module.exports之间的引用关系。”
2.导出的是属性和方法
例如,在router_handler/user.js中导出一个函数
exports.regUser = (req,res)=>{
res.send('ok')
}
在router/user.js中导入这个模块,是可以正常使用这个函数的,可见导出的属性或者方法时,二者是可以混用的。
//该路由负责用户注册和登录
//导入第三方模块
const express = require('express')
const router = express.Router()
//导入自定义模块
const router_handler = require('../router_handler/user')
router.post('/register',router_handler.regUser)
//导出路由
// exports = router
module.exports = router
总结
其实关于二者还有很多容易混淆的误区,但是始终记住,exports 是 module.exports 的一个引用,一切以module.exports为主,它的优先级更高,这样再遇到类似的问题就不至于毫无头绪了。