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

Node.js导出Sequelize模型时遇EEXIST错误求助

Node.js中Sequelize模型复用触发EEXIST错误的解决方案

触发的错误信息

Error: EEXIST: file already exists, uv_pipe_open
    at new Socket (node:net:361:24)
    at process.getStdin [as stdin] (node:internal/bootstrap/switches/is_main_thread:226:17)
    at get (<anonymous>)
    at getOwn (node:internal/bootstrap/loaders:189:5)
    at NativeModule.syncExports (node:internal/bootstrap/loaders:311:31)
    at NativeModule.compileForPublicLoader (node:internal/bootstrap/loaders:277:10)
    at loadNativeModule (node:internal/modules/cjs/helpers:49:9)
    at Function.Module._load (node:internal/modules/cjs/loader:818:15)
    at Module.require (node:internal/modules/cjs/loader:1028:19)
    at require (node:internal/modules/cjs/helpers:102:18)

该错误在调用/config/common.js中的数据库连接方法初始化Sequelize模型时触发,相关代码及修复方案如下:


相关文件代码(含修复)

/config/common.js

var Sequelize = require('sequelize');

function Common() {
  // 新增缓存对象,避免重复创建连接和模型
  this.sequelizeInstances = {};
  this.models = {};
};

Common.prototype.AdminDBName = "ldgybxav_anocracy";
Common.prototype.AdminDBUID = "ldgybxav_allyadminmedi2021";
Common.prototype.AdminDBPWD = "MediAlly202!";

Common.prototype.setSequelize = function(db_name, db_user, db_password) {
  // 缓存已创建的连接实例,避免重复初始化
  if (this.sequelizeInstances[db_name]) {
    return this.sequelizeInstances[db_name];
  }
  var sequelize = new Sequelize(db_name, db_user, db_password, {
    timezone: '+05:30',
    host:'103.108.220.123',
    dialect:'mysql',
    pool: {
        max: 5,
        min: 0,
        acquire: 30000,
        idle: 10000
      }
  });
  this.sequelizeInstances[db_name] = sequelize;
  return sequelize;
}

Common.prototype.setPharmaDBConn = function(model) {
  const dbKey = 'ldgybxav_anocracy';
  // 缓存已初始化的模型
  if (this.models[dbKey]) {
    return this.models[dbKey];
  }
  var sequelize = this.setSequelize(dbKey, this.AdminDBUID, this.AdminDBPWD);
  var entityObject = model(sequelize, Sequelize);
  this.models[dbKey] = entityObject;
  return entityObject;
}

module.exports = new Common()

/routes/users/usermaster.js

var router = require('express').Router();
var common = require('../../config/common');
var Sequelize = require('sequelize');
const { Op } = require("sequelize");

var UserMasterModel1 = require('../../models/UserMaster1');
// 提前初始化模型,仅执行一次,避免每次请求重复创建
var UserMaster1 = common.setPharmaDBConn(UserMasterModel1);

// 新增连接验证中间件,确保模型可用
router.use(async function(req, res, next) {
  try {
    // 验证数据库连接有效性
    await common.sequelizeInstances['ldgybxav_anocracy'].authenticate();
    if(!UserMaster1) {
      throw new Error('模型初始化失败');
    }
    next();
  } catch (error) {
    console.error(error);
    if (error.code === 'EEXIST') {
      return res.status(500).send({'message' : '数据库连接重复创建,请检查缓存逻辑'});
    }
    return res.status(500).send({'message': '数据库连接失败:' + error.message});
  }
});

router.get('/', (req, res) => {
  res.status(200).send('Welcome To Annocracy User Master');
});

router.get('/user_name/:user_name/user_psw/:user_psw/role_level/:role_level', async (req,res) => {
  try {
    const resultSet = await UserMaster1.findAll({
      where : {
        [Op.and] : [
          {user_name : req.params.user_name}, 
          {user_psw : req.params.user_psw}, 
          {role_level: req.params.role_level}
        ]
      }
    });
    res.status(200).send(resultSet);
  } catch(error) {
    console.log(error);
    res.status(500).send('请求异常:输入参数有误或数据库错误,详情:' + error.message);
  }
});

module.exports = router;

/models/UserMaster1.js

module.exports =(sequelize, Sequelize )=>{
    const UserMaster = sequelize.define("UserMaster", {
        user_id:{
            type: Sequelize.BIGINT(11),
            primaryKey:  true,
            autoIncrement: true
        },
        user_name: {type: Sequelize.STRING, allowNull: false},
        user_psw: {type: Sequelize.STRING, allowNull: false},
        user_ph: {type: Sequelize.BIGINT(10), allowNull: false},
        role_level: {type: Sequelize.STRING, allowNull: false},
        supervisor_id: {type: Sequelize.BIGINT(10), allowNull: false},
        role_id: {type: Sequelize.BIGINT(10), allowNull: true},
        role_id_name: {type: Sequelize.STRING, allowNull: false},
        record_created_by: {type: Sequelize.STRING, allowNull: true},
        record_created_date: {type: Sequelize.DATE, allowNull: true},
        record_modified_by: {type: Sequelize.STRING, allowNull: true},
        record_modified_date: {type: Sequelize.DATE, allowNull: true},
    },{
        timestamps:false,
        freezeTableName: true,
        tableName: 'UserMaster'
    });
    return UserMaster;
}

问题根源

  1. 重复创建Sequelize实例:原代码中每次请求都会通过router.use中间件调用setPharmaDBConn,每次都会新建Sequelize连接实例,导致底层网络资源重复占用,触发uv_pipe_open的EEXIST错误。
  2. 模型重复初始化:同一个模型被多次传入初始化函数,生成重复的模型对象,干扰Sequelize的内部管理。

修复要点

  1. 添加缓存机制:在Common类中新增缓存对象,存储已创建的Sequelize连接实例和模型,避免重复创建。
  2. 提前初始化模型:将模型初始化逻辑移到路由文件顶部,仅执行一次,而非每次请求都执行。
  3. 连接验证:新增数据库连接验证中间件,确保连接正常后再处理请求,增强错误处理的准确性。
  4. 改用异步/await:将回调式的数据库操作改为async/await,提升代码可读性和错误处理效率。

内容的提问来源于stack exchange,提问作者Krish

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 07:45:26