TypeError: Router.use() requires a middleware function but got a Object

前言

如题所示,这是我今天写代码时遇到的一个问题,这其中涉及到了一些关于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为主,它的优先级更高,这样再遇到类似的问题就不至于毫无头绪了。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秋窗7

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值