我正在尝试使用
knex
CLI 在 Node.js ESM 环境中实现本地 MySQL 数据库的迁移。
我的
knexfile.js
文件如下所示:
import { DB_NAME, DB_PASSWORD, DB_USER } from "../config/env.js";
/**
* @type { Object.<string, import("knex").Knex.Config> }
*/
export default {
development: {
client: "mysql2",
connection: {
database: DB_NAME,
user: DB_USER,
password: DB_PASSWORD,
},
pool: {
min: 2,
max: 10,
},
migrations: {
tableName: "knex_migrations",
},
},
};
我使用
knex migrate:make initial_schema --knexfile database/knexfile.js --esm
成功创建了我的第一个迁移文件,我已将其写入我的第一个用户表:
/**
* @param { import("knex").Knex } knex
* @returns { Promise<void> }
*/
exports.up = function (knex) {
return knex.schema.createTable("user", (table) => {
table.increments("id").primary().unsigned().notNullable();
table.string("profilname", 255).unique().notNullable();
table.string("username", 255).unique().notNullable();
table.string("password", 511).notNullable();
table.timestamp("createdAt").notNullable().defaultTo(knex.fn.now());
table
.timestamp("updatedAt")
.notNullable()
.defaultTo(knex.raw("NOW() ON UPDATE NOW()"));
table.datetime("lastLogin");
table
.enum("role", ["admin", "writer", "user"])
.notNullable()
.defaultTo("user");
});
};
/**
* @param { import("knex").Knex } knex
* @returns { Promise<void> }
*/
exports.down = function (knex) {
return knex.schema.dropTableIfExists("user");
};
到目前为止一切正常。但是当我运行
knex migrate:latest --knexfile database/knexfile.js --esm
时,我收到以下错误:
> knex migrate:latest --knexfile database/knexfile.js --esm
Working directory changed to ~/PATH_TO_MY_LOCAL_DEV_FOLDER
Using environment: development
Knex: run
$ npm install mysql2 --save
Invalid or unexpected token
/LOCAL_ENV/node_modules/mysql2/node_modules/lru-cache/dist/cjs/index.js:781
this.#dispose?.(oldVal, k, 'set');
^
SyntaxError: Invalid or unexpected token
at Module._extensions..js (node:internal/modules/cjs/loader:1308:10)
[...]
mysql2
软件包已安装。此外,我多次尝试删除 node_modules
文件夹并重新安装我的依赖项,希望能够解决问题。
这是我的
package.json
中最相关的部分:
{
[...]
"main": "index.js",
"type": "module",
"scripts": {
[...]
},
"dependencies": {
"cookie-parser": "^1.4.6",
"dompurify": "^3.0.5",
"dotenv": "^16.3.1",
"express": "^4.18.2",
"helmet": "^7.0.0",
"jsdom": "^22.1.0",
"jsonwebtoken": "^9.0.2",
"knex": "^3.0.1",
"marked": "^9.0.3",
"morgan": "^1.10.0",
"mysql2": "^3.6.3",
"objection": "^3.1.2",
"pug": "^3.0.2",
"zod": "^3.22.2"
},
"devDependencies": {
[...]
}
}
我认为这个问题可能与我使用ESM有关。这是因为我尝试在 CommonJS 模块环境中重现该错误,并且没有引发任何错误。
降级到[电子邮件受保护]终于让我解决了这个问题。我怀疑这是 ESM 的问题。
您可以通过将 package.json 依赖项设置为来使 mysql2 客户端保持最新状态
"mysql":"^2.3.3"
因此,小版本和补丁会下降,但请保留版本 2 以避免此问题。