You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Express Router引入路由时Node.js报MODULE_NOT_FOUND崩溃

问题复现

跟随后端开发教程编写代码到9分30秒位置时,启动后端服务终端抛出MODULE_NOT_FOUND错误,报错信息如下:

node:internal/modules/cjs/loader:936
  throw err;
  ^

Error: Cannot find module '/routes/workouts'
Require stack:
- C:\Users\localadmin\Desktop\cpp-queens\backend\server.js  
    at Function.Module._resolveFilename (node:internal/modules/cjs/loader:933:15)
    at Function.Module._load (node:internal/modules/cjs/loader:778:27)
    at Module.require (node:internal/modules/cjs/loader:1005:19)
    at require (node:internal/modules/cjs/helpers:102:18)   
    at Object.<anonymous> (C:\Users\localadmin\Desktop\cpp-queens\backend\server.js:4:23)
    at Module._compile (node:internal/modules/cjs/loader:1105:14)
    at Object.Module._extensions..js (node:internal/modules/cjs/loader:1159:10)
    at Module.load (node:internal/modules/cjs/loader:981:32)    at Function.Module._load (node:internal/modules/cjs/loader:822:12)
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:77:12) {
  code: 'MODULE_NOT_FOUND',
  requireStack: [ 'C:\\Users\\localadmin\\Desktop\\cpp-queens\\backend\\server.js' ]
}
[nodemon] app crashed - waiting for file changes before starting...

注释掉Express Router相关代码后服务可正常运行,出问题的server.js代码如下:

require('dotenv').config()

const express =  require('express')
// const workoutRoutes = require('/routes/workouts') MAKES APP CRASH

// express app
const app = express()

// middleware
app.use(express.json())

app.use((req, res, next) => {
    console.log(req.path, req.method)
    next()
})

// routes
app.get('/', (req, res) => {
    res.json({msg: 'Welcome to the app'})
})
// app.use('/api/workouts', workoutRoutes) MAKES APP CRASH

// listening to requests
app.listen(process.env.PORT, () => {
    console.log('listening on port 4000, testing')
})

process.env

routes/workouts.js路由文件代码如下:

const express = require('express')

const router = express.Router()

// GET all workouts
router.get('/', (req, res) => {
    res.json({msg: 'GET all workouts'})
})

// GET a single workout
router.get('/:id', (res, req) => {
    res.json({msg: 'GET a single workout'})
})

// POST all workouts
router.post('/', (req, res) => {
    res.json({msg: 'GET all workouts'})
})

// DELETE a single workout
router.delete('/:id', (res, req) => {
    res.json({msg: 'DELETE a single workout'})
})

// UPDATE a single workout
router.patch('/:id', (res, req) => {
    res.json({msg: 'UPDATE a single workout'})
})
module.exports = router
报错原因

一共两个核心问题,第一个直接触发当前启动崩溃,第二个会导致路径修复后接口请求报错:

  • 模块导入路径写法错误:Node.js中require()路径以/开头时,会去操作系统的根目录查找文件,而非项目根目录。写的/routes/workouts会被解析为系统盘根目录下的routes文件夹,自然找不到对应模块,直接抛出MODULE_NOT_FOUND错误。
  • 路由回调参数顺序错误:workouts.js中带动态参数:id的三个路由(单条查询、删除、更新),回调函数的参数顺序写反了。Express路由回调固定顺序是(请求对象req, 响应对象res, 下一步中间件next),写成(res, req)后,后续调用res.json()时实际是在请求对象上找json方法,会触发类型错误。
修复方法

按以下步骤修改即可:

  1. 修正server.js中的路由导入路径,使用相对路径引用同项目下的文件,去掉路径开头的/,换成./(代表当前js文件所在目录),同时取消相关代码的注释:
    // 修改导入行
    const workoutRoutes = require('./routes/workouts')
    // 取消路由挂载的注释
    app.use('/api/workouts', workoutRoutes)
    
    另外文件最后一行单独写的process.env是多余代码,直接删除即可,不影响运行但没有实际作用。
  2. 修正workouts.js里三个写反参数的路由回调,把(res, req)全部改成(req, res),修正后对应代码段如下:
    // GET a single workout
    router.get('/:id', (req, res) => {
        res.json({msg: 'GET a single workout'})
    })
    
    // DELETE a single workout
    router.delete('/:id', (req, res) => {
        res.json({msg: 'DELETE a single workout'})
    })
    
    // UPDATE a single workout
    router.patch('/:id', (req, res) => {
        res.json({msg: 'UPDATE a single workout'})
    })
    

改完保存,nodemon会自动重启服务,报错就会消失,接口可以正常访问。

内容的提问来源于stack exchange,提问作者Soccerball123

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 16:33:41