1.问题:
近期构建了一个koa2的服务器,其中用到了sequelize-typescript这个orm框架,并试图用webpack v5将代码打包(包括node_modules)。打包过程没有问题,但当运行打包后的程序时,控制台报错:throw error 'new Error('Please install mysql2 package manually');',意思是sequelize用到mysql2这个包,可没有安装。可是明明在本地安装了mysql2以及sequelize,为什么还是不行呢? 以下是我的seuqlize配置:
import { SequelizeOptions } from "sequelize-typescript";
export const MYSQL_CONF: SequelizeOptions = {
host: "localhost",
username: "root",
password: "root",
port: 3306,
database: "vacation_db",
dialect: "mysql",
};
2.问题原因:
经网络查询解决方案,最后在这github.com/sequelize/s…找到答案。 原因是这样的: 这是sequelize中的一段源码:
_loadDialectModule(moduleName) {
try {
if (this.sequelize.config.dialectModulePath) {
return require(this.sequelize.config.dialectModulePath);
}
if (this.sequelize.config.dialectModule) {
return this.sequelize.config.dialectModule;
}
return require(moduleName);
} catch (err) {
if (err.code === 'MODULE_NOT_FOUND') {
if (this.sequelize.config.dialectModulePath) {
throw new Error(`Unable to find dialect at ${this.sequelize.config.dialectModulePath}`);
}
throw new Error(`Please install ${moduleName} package manually`);
}
throw err;
}
}
其中require(moduleName)这段代码是无法被webpack正确解析的,所以导致找不到相应模块。
3.解决方案: 从上面代码可以看出问题是无法找到正确的dialectModule引起的,所以需要手动给sequelize设置dialectModule。只要把sequelize配置选项改为这样就可以了:
import { SequelizeOptions } from "sequelize-typescript";
import mysql2 from "mysql2"; // 手动引入
export const MYSQL_CONF: SequelizeOptions = {
host: "localhost",
username: "root",
password: "root",
port: 3306,
database: "vacation_db",
dialect: "mysql",
dialectModule: mysql2, // 手动配置
};
或改成这种形式:
import mysql2 from 'mysql2';
if (options.dialect === 'mysql') {
options.dialectModule = mysql2;
}
new Sequelize(options)