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

执行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错误,无法定位原因,寻求技术帮助。

相关资源

  • 数据库结构:Database结构
  • 项目文件夹结构:项目文件夹结构

相关代码文件

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')未返回预期函数,根源是:

  1. 重复创建Sequelize实例:config/database.js已配置正确的数据库连接,但models/index.js又创建了一个使用占位符配置的无效实例,未复用统一连接。
  2. 模块导入冲突: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 04:47:02