如何解决在 nextjs 中使用 sequelize 连接 mysql 报错:Please install mysql2 package manually

101 阅读1分钟

解决方案

手动设置 dialectModule 的值为 mysql2。增加 dialectModule 配置即可。

import mysql2 from 'mysql2'
import { Sequelize } from 'sequelize'

const { DB_DATABASE, DB_USER, DB_PASSWORD, DB_HOST, DB_PORT, DB_LOGGING, DB_POLL_MAX, DB_POLL_MIN, DB_POLL_ACQUIRE, DB_POLL_IDLE, } = process.env

const sequelize = new Sequelize(DB_DATABASE, DB_USER, DB_PASSWORD, {
    host: DB_HOST, // 主机
    dialect: 'mysql', // 指定连接的数据库类型
    port: +DB_PORT, // 端口
    
    // 增加这个配置
    dialectModule: mysql2,
})

问题原因

webpack 不支持动态导入导致的。sequelize 内部使用 require 动态导入 dialectModule 配置
源码: node_modules/.pnpm/sequelize@6.37.3_mysql2@3.11.3/node_modules/sequelize/lib/dialects/abstract/connection-manager.js

image.png

问题 issues

扩展

如果发现解决完之后还有链接数据库会有警告
Critical dependency: the request of a dependency is an expression Import trace for requested module:

修改 nextjs配置 (next.config.mjs) 即可。

// 增加配置
const nextConfig = {
    // 增加配置即可
    experimental: {
        serverComponentsExternalPackages: ['sequelize',],
    },
}

问题issue