使用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方法,会触发类型错误。
修复方法
按以下步骤修改即可:
- 修正
server.js中的路由导入路径,使用相对路径引用同项目下的文件,去掉路径开头的/,换成./(代表当前js文件所在目录),同时取消相关代码的注释:
另外文件最后一行单独写的// 修改导入行 const workoutRoutes = require('./routes/workouts') // 取消路由挂载的注释 app.use('/api/workouts', workoutRoutes)process.env是多余代码,直接删除即可,不影响运行但没有实际作用。 - 修正
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
相关产品推荐
相关产品推荐

