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; }
问题根源
- 重复创建Sequelize实例:原代码中每次请求都会通过
router.use中间件调用setPharmaDBConn,每次都会新建Sequelize连接实例,导致底层网络资源重复占用,触发uv_pipe_open的EEXIST错误。 - 模型重复初始化:同一个模型被多次传入初始化函数,生成重复的模型对象,干扰Sequelize的内部管理。
修复要点
- 添加缓存机制:在
Common类中新增缓存对象,存储已创建的Sequelize连接实例和模型,避免重复创建。 - 提前初始化模型:将模型初始化逻辑移到路由文件顶部,仅执行一次,而非每次请求都执行。
- 连接验证:新增数据库连接验证中间件,确保连接正常后再处理请求,增强错误处理的准确性。
- 改用异步/await:将回调式的数据库操作改为
async/await,提升代码可读性和错误处理效率。
内容的提问来源于stack exchange,提问作者Krish
相关产品推荐
相关产品推荐

