Knex:运行 $ npm install mysql2 --save 无效或意外的令牌

问题描述 投票:0回答:1

我正在尝试使用

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 模块环境中重现该错误,并且没有引发任何错误。

node.js knex.js mysql2
1个回答
0
投票

降级到[电子邮件受保护]终于让我解决了这个问题。我怀疑这是 ESM 的问题。

您可以通过将 package.json 依赖项设置为来使 mysql2 客户端保持最新状态

"mysql":"^2.3.3"
因此,小版本和补丁会下降,但请保留版本 2 以避免此问题。

© www.soinside.com 2019 - 2024. All rights reserved.