MERN栈后端启动报ERR_MODULE_NOT_FOUND错误,求技术帮助
问题详情
学习MERN栈后端开发时,使用nodemon启动服务器触发ERR_MODULE_NOT_FOUND错误,提示无法从C:\Users\charl\Desktop\movie-reviews\backend\index.js找到导入的C:\Users\charl\Desktop\movie-reviews\server.js模块。已尝试在package.json中添加启动命令,但问题未解决,请求排查。
错误信息
node:internal/errors:491 ErrorCaptureStackTrace(err); ^ Error [ERR_MODULE_NOT_FOUND]: Cannot find module 'C:\Users\charl\Desktop\movie-reviews\server.js' imported from C:\Users\charl\Desktop\movie-reviews\backend\index.js at new NodeError (node:internal/errors:400:5) at finalizeResolution (node:internal/modules/esm/resolve:326:11) at moduleResolve (node:internal/modules/esm/resolve:945:10) at defaultResolve (node:internal/modules/esm/resolve:1153:11) at nextResolve (node:internal/modules/esm/loader:163:28) at ESMLoader.resolve (node:internal/modules/esm/loader:842:30) at ESMLoader.getModuleJob (node:internal/modules/esm/loader:424:18) at ModuleWrap.<anonymous> (node:internal/modules/esm/module_job:77:40) at link (node:internal/modules/esm/module_job:76:36) { code: 'ERR_MODULE_NOT_FOUND'
相关代码文件
index.js(路径:backend/index.js)
import app from '../server.js' import mongodb from "mongodb" import dotenv from "dotenv" async function main(){ dotenv.config() const client = new mongodb.MongoClient(process.env.MOVIEREVIEWS_DB_URI) const port = process.env.PORT || 8000 try{ // 连接MongoDB集群 await client.connect() app.listen(port,()=>{ console.log("server is running on port: " + port); }) } catch (e){ console.error(e); process.exit(1) } } main().catch(console.error);
server.js(路径:server.js)
import express from 'express' import cors from 'cors' import movies from './api/movies.rout.js' const app = express() app.use(cors()) app.use(express.json()) app.use("/api/v1/movies",movies) app.use('*', (req,res)=>{ res.status(404).json({error:"not found"}) }) export default app
movies.route.js(路径:api/movies.route.js)
import express from 'express' const router = express.Router() // 获取Express路由实例 router.route('/').get((req,res) => res.send('hello world')) export default router
connection.env
MOVIEREVIEWS_DB_URI=database MOVIEREVIEWS=sample_mflix PORT=500
已尝试的解决方案
在package.json中添加启动命令:
"start": "nodemon --experimental-modules --es-module-specifier-resolution=node index.js"
排查与解决方法
修正启动命令的文件路径
当前启动命令直接指向index.js,但该文件实际位于backend目录下,在项目根目录执行命令时,需要指定完整路径:"start": "nodemon --experimental-modules --es-module-specifier-resolution=node backend/index.js"添加ES模块标识
在项目根目录的package.json中添加"type": "module"字段,让Node.js默认将所有.js文件当作ES模块处理,避免解析冲突:{ "type": "module", "scripts": { "start": "nodemon backend/index.js" } }添加后可省略
--experimental-modules参数(Node.js 14.13.0+已默认支持ES模块)。验证文件路径匹配度
确认server.js确实存在于项目根目录(即movie-reviews文件夹下),与backend/index.js中../server.js的相对路径指向一致;同时检查文件名大小写(Windows系统不区分大小写,但Node.js模块解析可能严格区分)。修正dotenv配置路径
当前dotenv.config()未指定配置文件路径,若connection.env不在backend目录下,需传入正确路径:dotenv.config({ path: '../connection.env' })
内容的提问来源于stack exchange,提问作者Chaaachaa2223

