webpack打包sequelize-typescript遇到的坑

492 阅读1分钟

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)

问题解决啦~!