使用pkg打包Sequelize+MySQL的Node.js应用时遇mysql2安装报错
问题复现
使用pkg打包基于Node.js、Sequelize连接MySQL的应用后,运行时出现错误:
Error: Please install mysql2 package manually
at ConnectionManager._loadDialectModule (/snapshot/psq/node_modules/sequelize/lib/dialects/abstract/connection-manager.js:55:15)
at new ConnectionManager (/snapshot/psq/node_modules/sequelize/lib/dialects/mysql/connection-manager.js:30:21)
at new MysqlDialect (/snapshot/psq/node_modules/sequelize/lib/dialects/mysql/index.js:13:30)
at new Sequelize (/snapshot/psq/node_modules/sequelize/lib/sequelize.js:194:20)
at Object.(/snapshot/psq/dist/database/index.js)
at Module._compile (pkg/prelude/bootstrap.js:1926:22)
已尝试npm install mysql2、npm install -g mysql2无效,以下是可行解决方案:
显式配置pkg包含mysql2模块
pkg默认不会自动捕获Sequelize动态加载的mysql2模块,需在package.json中添加pkg配置:"pkg": { "scripts": "node_modules/mysql2/**/*.js", "assets": "node_modules/mysql2/**/*.node" }或打包时通过命令行参数指定:
pkg . --include node_modules/mysql2/**/*确认mysql2为生产依赖
确保mysql2被安装到生产依赖中(而非开发依赖),执行:npm install mysql2 --save检查
package.json的dependencies字段,确认存在mysql2条目。手动指定Sequelize的dialectModule
在初始化Sequelize时,手动引入mysql2并传入参数,绕过动态加载逻辑:const { Sequelize } = require('sequelize'); const mysql2 = require('mysql2'); const sequelize = new Sequelize('你的数据库名', '用户名', '密码', { host: 'localhost', dialect: 'mysql', dialectModule: mysql2 });清理缓存后重新打包
删除旧依赖和锁文件,重新安装后打包:rm -rf node_modules package-lock.json npm install pkg .
内容的提问来源于stack exchange,提问作者ِAmin

