为什么express.Router直接作为app.use参数报错,导出导入后可正常运行?
问题核心原因
两种写法传入app.use()的第二个参数类型完全不同,导致报错:
- 正确写法中传入的是合法的
Router实例,符合app.use()的参数要求 - 错误写法中传入的是
Route实例对象,不属于app.use()支持的参数类型
详细拆解
1. 单独导出Router实例可以正常运行的原因
express.Router()执行后返回的是完整的Router实例,它本身实现了Express的中间件接口规范,是app.use()官方支持的合法参数类型,可以直接挂载到指定路径下处理请求。
2. 直接传入router.route('/').get(...)报错的原因
router.route(path)方法的作用是创建一个对应指定路径的Route实例,后续链式调用.get()、.post()等方法是给这个Route实例挂载对应HTTP方法的处理函数,整个链式调用的返回值是Route实例而非Router实例。Route是Express内部用于管理单一路径多方法处理的普通对象,没有实现中间件的调用接口,不符合app.use()的参数要求,因此会抛出Router.use() requires a middleware function but got a Object的类型错误。
不抽离文件的正确写法
如果不想单独拆分路由文件,需要先给Router实例挂载好路由规则,再将整个Router实例传入app.use():
import express from 'express' const app = express() const router = express.Router() // 先给Router实例挂载路由规则 router.route('/').get((req, res) => res.end('Test Users')) // 再传入完整的Router实例 app.use("/api/v1/users", router) export default app
内容的提问来源于stack exchange,提问作者RiskItAll
相关产品推荐
相关产品推荐

