模块化中module.exports对于路由和中间件模块的导出挂载误区(TypeError:app.use() requires a middleware function)

module.exports常规的挂载方式

在这里插入图片描述
这样可以将js模块文件中特定的数据和方法向外导出

但是当在导出路由模块和中间件时,却出现了如下报错

报错时我的代码:
导出方式:module.exports.router1 = router
外部文件导入方式:const router = require(‘router模块路径’)
中间件注册挂载方式:app.use(router)

在这里插入图片描述
根据它提示的问题路径,我找到了导致报错的地方,原因是在express模块文件中,存在一个语句,它标明app.use()这个设置全局中间件的方法中不能导入一个中间件文件。

问题是:我以点语法挂载router对象到导出模块的对象空间中,在导出时使用的却是导出的模块对象,而不是挂在上去的那个router对象,这就导致了错误

解决办法

办法一、
在这里插入图片描述
改写一下挂载方式,不使用点语法,而是直接写module.exports = 函数名,这样就能让服务器正常运行了
办法二、
改一下引入方式,在原有的module.exports.router1 = router 点语法的导出基础上,外部其他文件导入该模块并挂在为中间件时,应该是
const router = require(‘router模块路径’)
app.use(router.router1)

之后就能如下正常运行了
在这里插入图片描述
总结:对于此问题,问题在于module.exports默认指向的是一个对象空间,所以可以往它上面通过点语法挂载属性和属性值,向外导出的时候,外部需要使用到的空间里面的属性,但是此处定义的router路由是一个对象,所以需要router.router1来调用其内需要被使用到的属性
而module.exports = router的方式则是直接替换的module.exports的指向空间,外部文件require导入获取到的直接就是需要被使用到的router属性了

  • 7
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值