Next.js + Mongoose(MongoDB)数据库填充报错求助
解决Next.js中Mongoose数据库填充脚本的模块错误问题
问题背景
在Next.js项目中编写Mongoose数据库填充脚本seeder.js,配置package.json命令后运行出现多次模块相关错误,以下是问题代码、配置及对应解决方法:
原始代码与配置
seeder.js 代码:
import Product from '/models/productModel'; import products from '/data/products'; import dbConnect from '/config/dbConnect'; dbConnect(); const seedProducts = async () => { try { await Product.deleteMany(); console.log('Products are deleted'); await Product.insertMany(products); console.log('All Products are added.'); process.exit(); } catch (error) { console.log(error.message); process.exit(); } }; seedProducts();
package.json 脚本配置:
"scripts": { "dev": "next dev", "build": "next build", "start": "next start", "lint": "next lint", "seeder": "node utils/seeder" },
错误1:ES模块语法错误
报错信息
(node:27824) Warning: To load an ES module, set "type": "module" in the package.json or use the .mjs extension. (Use `node --trace-warnings ...` to show where the warning was created) C:\Users\tarek\Desktop\Code\utils\seeder.js:1 import Product from '/models/productModel'; ^^^^^^ SyntaxError: Cannot use import statement outside a module
解决方法
两种方案二选一:
- 将
seeder.js重命名为seeder.mjs(后续需同步更新命令); - 在项目根目录的
package.json中添加"type": "module"字段,使整个项目默认使用ES模块:{ "type": "module", // 其他原有配置... }
错误2:模块路径找不到(文件后缀未更新)
报错信息
node:internal/modules/cjs/loader:959 throw err; ^ Error: Cannot find module 'C:\Users\tarek\Desktop\Code\utils\seeder' at Module._resolveFilename (node:internal/modules/cjs/loader:956:15) at Module._load (node:internal/modules/cjs/loader:804:27) at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12) at node:internal/main/run_main_module:17:47 { code: 'MODULE_NOT_FOUND', requireStack: [] }
解决方法
因为已经将文件改为seeder.mjs,需要更新package.json中的seeder命令,添加文件后缀:
"scripts": { // 其他命令... "seeder": "node utils/seeder.mjs" },
错误3:导入模块路径错误
报错信息
Error [ERR_MODULE_NOT_FOUND]: Cannot find module 'C:\models\productModel' imported from C:\Users\tarek\Desktop\Code\utils\seeder.mjs at new NodeError (node:internal/errors:387:5) at finalizeResolution (node:internal/modules/esm/resolve:404:11) at moduleResolve (node:internal/modules/esm/resolve:965:10) at defaultResolve (node:internal/modules/esm/resolve:1173:11) at nextResolve (node:internal/modules/esm/loader:173:28) at ESMLoader.resolve (node:internal/modules/esm/loader:852:30) at ESMLoader.getModuleJob (node:internal/modules/esm/loader:439:18) at ModuleWrap. (node:internal/modules/esm/module_job:76:40) at link (node:internal/modules/esm/module_job:75:36) { code: 'ERR_MODULE_NOT_FOUND' }
解决方法
Node.js的ES模块中,/开头的路径会被解析为系统根目录(如C:\),而非项目根目录。需要将导入路径改为相对路径,并添加完整文件后缀:
假设项目目录结构为:
项目根目录/ ├── models/ │ └── productModel.js ├── data/ │ └── products.js ├── config/ │ └── dbConnect.js └── utils/ └── seeder.mjs
修改seeder.mjs中的导入路径:
// 从utils目录往上一级到项目根目录,再指向对应文件 import Product from '../models/productModel.js'; import products from '../data/products.js'; import dbConnect from '../config/dbConnect.js';
完成以上修改后,运行npm run seeder即可正常执行数据库填充脚本。
内容的提问来源于stack exchange,提问作者User_T
相关产品推荐
相关产品推荐

