执行npm run dev时出现TypeError: require(...) is not a function错误求助
Node.js项目启动报错TypeError: require(...) is not a function
问题背景
开发第一个Node.js登录项目,已配置数据库,执行npm run dev启动项目时触发TypeError: require(...) is not a function错误,无法定位原因,寻求技术帮助。
相关资源
- 数据库结构:

- 项目文件夹结构:

相关代码文件
config/database.js
const { Sequelize } = require('sequelize'); const sequelize = new Sequelize('dfddatabase', 'root', 'Password', { host: 'localhost', dialect: 'mariadb', logging: false }); const connectDb = async () => { try { await sequelize.authenticate(); console.log('Connection has been established successfully.'); } catch (error) { console.error('Unable to connect to the database:', error); } }; module.exports = { sequelize, connectDb };
models/index.js
const { Sequelize, DataTypes } = require('sequelize'); const sequelize = new Sequelize('mysql://user:password@localhost:3306/database_name', { dialect: 'mariadb', }); // Import models const User = require('./user')(sequelize, DataTypes); const CsvFile = require('./csvfile')(sequelize, DataTypes); const PasswordReset = require('./passwordreset')(sequelize, DataTypes); const Setting = require('./setting')(sequelize, DataTypes); const ScharnierType = require('./scharniertype')(sequelize, DataTypes); const DeurType = require('./deurtype')(sequelize, DataTypes); // Define associations User.hasMany(CsvFile, { foreignKey: 'user_id' }); CsvFile.belongsTo(User, { foreignKey: 'user_id' }); User.hasOne(Setting, { foreignKey: 'user_id' }); Setting.belongsTo(User, { foreignKey: 'user_id' }); Setting.belongsToMany(ScharnierType, { through: 'settings_scharniertypes' }); ScharnierType.belongsToMany(Setting, { through: 'settings_scharniertypes' }); Setting.belongsToMany(DeurType, { through: 'settings_deurtypes' }); DeurType.belongsToMany(Setting, { through: 'settings_deurtypes' }); module.exports = { sequelize, Sequelize, User, CsvFile, PasswordReset, Setting, ScharnierType, DeurType }; sequelize.sync({ force: true }).then(() => { console.log("Database & tables created!"); });
user.js
module.exports = (sequelize, DataTypes) => { const User = sequelize.define('User', { id: { type: DataTypes.UUID, defaultValue: DataTypes.UUIDV4, primaryKey: true, }, email: { type: DataTypes.STRING, unique: true, allowNull: false, }, password: { type: DataTypes.STRING, allowNull: false, }, createdAt: { type: DataTypes.DATE, defaultValue: DataTypes.NOW, }, updatedAt: { type: DataTypes.DATE, defaultValue: DataTypes.NOW, }, }, { tableName: 'users' }); return User; };
routes/index.js
const express = require('express'); const router = express.Router(); // Index Page router.get('/', (req, res) => res.render('index', { title: 'Home' })); module.exports = router;
app.js
const express = require('express'); const session = require('express-session'); const flash = require('connect-flash'); const passport = require('passport'); const path = require('path'); const { connectDb } = require('./models'); const sequelize = require('./config/database'); const app = express(); app.listen(PORT, () => { console.log(`Server running on http://localhost:4000`); }); // Passport Config require('./config/passport')(passport); // EJS app.set('view engine', 'ejs'); // Static Files app.use(express.static(path.join(__dirname, 'public'))); // Bodyparser app.use(express.urlencoded({ extended: false })); // Express session app.use( session({ secret: 'secret', resave: true, saveUninitialized: true }) ); // Passport middleware app.use(passport.initialize()); app.use(passport.session()); // Connect flash app.use(flash()); // Global variables app.use((req, res, next) => { res.locals.success_msg = req.flash('success_msg'); res.locals.error_msg = req.flash('error_msg'); res.locals.error = req.flash('error'); res.locals.user = req.user || null; next(); }); // Routes app.use('/', require('./routes/index')); app.use('/auth', require('./routes/auth')); app.use('/password', require('./routes/password')); const PORT = process.env.PORT || 5000; connectDb().then(() => { app.listen(PORT, console.log(`Server started on port ${PORT}`)); });
package.json
{ "name": "loginapp", "version": "1.0.0", "main": "index.js", "scripts": { "dev": "nodemon app.js", "start": "node app.js" }, "keywords": [], "author": "", "license": "ISC", "description": "", "dependencies": { "bcryptjs": "^2.4.3", "connect-flash": "^0.1.1", "dotenv": "^16.4.5", "ejs": "^3.1.10", "express": "^4.19.2", "express-session": "^1.18.0", "jsonwebtoken": "^9.0.2", "mariadb": "^3.3.1", "mysql2": "^3.10.1", "nodemailer": "^6.9.14", "nodemailer.js": "^0.0.2-security", "passport": "^0.7.0", "passport-local": "^1.0.0", "sequelize": "^6.37.3" } }
控制台错误信息
C:\Users\Robbe\Downloads\LoginApp>npm run dev > loginapp@1.0.0 dev > nodemon app.js [nodemon] 3.1.1 [nodemon] to restart at any time, enter `rs` [nodemon] watching path(s): *.* [nodemon] watching extensions: js,mjs,cjs,json [nodemon] starting `node app.js` C:\Users\DelsoirRobbe\Downloads\LoginApp\models\index.js:7 const User = require('./user')(sequelize, DataTypes); ^ TypeError: require(...) is not a function at Object.<anonymous> (C:\Users\DelsoirRobbe\Downloads\LoginApp\models\index.js:7:31) at Module._compile (node:internal/modules/cjs/loader:1358:14) at Module._extensions..js (node:internal/modules/cjs/loader:1416:10) at Module.load (node:internal/modules/cjs/loader:1208:32) at Module._load (node:internal/modules/cjs/loader:1024:12) at Module.require (node:internal/modules/cjs/loader:1233:19) at require (node:internal/modules/cjs/helpers:179:18) at Object.<anonymous> (C:\Users\DelsoirRobbe\Downloads\LoginApp\app.js:6:23) at Module._compile (node:internal/modules/cjs/loader:1358:14) at Module._extensions..js (node:internal/modules/cjs/loader:1416:10) Node.js v20.13.1 [nodemon] app crashed - waiting for file changes before starting...
已尝试的解决方案
- 替换模型文件
- 修改localhost配置
- 更换数据库密码
- 重新安装npm依赖包
问题解决方法
核心原因
错误指向models/index.js第7行require('./user')(sequelize, DataTypes),说明require('./user')未返回预期函数,根源是:
- 重复创建Sequelize实例:
config/database.js已配置正确的数据库连接,但models/index.js又创建了一个使用占位符配置的无效实例,未复用统一连接。 - 模块导入冲突:
app.js同时导入models和config/database的实例,导致模块加载逻辑混乱。
修复步骤
1. 统一Sequelize实例,修改models/index.js
删除自建的Sequelize实例,改用config/database.js中的正确连接:
const { Sequelize, DataTypes } = require('sequelize'); // 导入config中的统一连接实例 const { sequelize, connectDb } = require('../config/database'); // Import models const User = require('./user')(sequelize, DataTypes); const CsvFile = require('./csvfile')(sequelize, DataTypes); const PasswordReset = require('./passwordreset')(sequelize, DataTypes); const Setting = require('./setting')(sequelize, DataTypes); const ScharnierType = require('./scharniertype')(sequelize, DataTypes); const DeurType = require('./deurtype')(sequelize, DataTypes); // 关联关系保留不变 module.exports = { sequelize, Sequelize, User, CsvFile, PasswordReset, Setting, ScharnierType, DeurType, connectDb }; sequelize.sync({ force: true }).then(() => { console.log("Database & tables created!"); });
2. 修正app.js的导入逻辑
删除重复的sequelize导入,统一从models获取资源,同时移除提前监听的无效代码:
const express = require('express'); const session = require('express-session'); const flash = require('connect-flash'); const passport = require('passport'); const path = require('path'); // 统一从models导入所需内容 const { connectDb, sequelize } = require('./models'); const app = express(); // 移除这行提前监听的代码(PORT未定义) // app.listen(PORT, () => { // console.log(`Server running on http://localhost:4000`); // }); // Passport Config require('./config/passport')(passport); // EJS app.set('view engine', 'ejs'); // Static Files app.use(express.static(path.join(__dirname, 'public'))); // Bodyparser app.use(express.urlencoded({ extended: false })); // Express session app.use( session({ secret: 'secret', resave: true, saveUninitialized: true }) ); // Passport middleware app.use(passport.initialize()); app.use(passport.session()); // Connect flash app.use(flash()); // Global variables app.use((req, res, next) => { res.locals.success_msg = req.flash('success_msg'); res.locals.error_msg = req.flash('error_msg'); res.locals.error = req.flash('error'); res.locals.user = req.user || null; next(); }); // Routes app.use('/', require('./routes/index')); app.use('/auth', require('./routes/auth')); app.use('/password', require('./routes/password')); const PORT = process.env.PORT || 5000; connectDb().then(() => { app.listen(PORT, console.log(`Server started on port ${PORT}`)); });
3. 检查其他模型文件
确保csvfile.js、passwordreset.js等所有模型文件的导出格式与user.js一致,均返回接收sequelize和DataTypes的函数。
4. 重启项目
执行npm run dev,问题即可解决。
内容的提问来源于stack exchange,提问作者robbe505
相关产品推荐
相关产品推荐

