【问题标题】:Error: Access denied for user ''@'localhost' (using password: NO)错误:用户 ''@'localhost' 的访问被拒绝(使用密码:否)
【发布时间】:2017-10-29 04:47:48
【问题描述】:

我正在尝试使用 MySQL 和 Knex 进行数据库迁移。

当我运行命令knex migrate:latest 时,我得到了

ER_ACCESS_DENIED_ERROR: Access denied for user ''@'localhost' (using password: NO)

我尝试在代码库上添加密码(到“123”和“否”),但最让我困惑的是,即使我的数据库文件中有user: "root",错误也会给出一个空字符串用户...

我分享我想象的相关文件:

// mysql_db.js

const knex = require('knex')({
  client: 'mysql',
  connection: {
    host: 'localhost',
    user: 'root',
    password: '',
    database: 'SQL_Data',
  },
});

module.exports = knex;

// knexfile.js

const path = require('path');

module.exports = {
    development: {
      client: 'mysql',
      connection: {
      filename: '/server/SQL/mysql_db',
    },
    migrations: {
      directory: path.join(__dirname, '/server/SQL/migrations'),
    },
    seeds: {
      directory: path.join(__dirname, '/server/SQL/seeds'),
    },
  },
};

//knex.js

const environment = proces.env.NODE_ENV || 'development';
const config = require('../../knexfile.js')[environment];
module.exports = require(knex)('config');

// "迁移定义"

exports.up = (knex, Promise) => knex.schema.createTable('sql_table', ((table) => {
  table.increments();
  table.string('name').notNullable();
  table.string('email').notNullable();
  table.string('description').notNullable();
  table.string('url').otNullable();
}));

exports.down = (knex, Promise) => knex.schema.dropTable('sql_table');

【问题讨论】:

标签: mysql database database-migration knex.js


【解决方案1】:

正如错误消息所说,您尝试使用无效凭据登录,名称为空字符串的用户在 DB 中不存在。

这意味着您的配置错误。您的 node-mysql 驱动程序配置中有一些奇怪的段,它试图引用其他文件,该文件导出初始化的 knex 实例

  client: 'mysql',
  connection: {
    filename: '/server/SQL/mysql_db'
  }

这完全是错误的。 knexfile 的正确格式与创建 knex 实例的格式几乎相同,除了 knexfile 还支持根据NODE_ENV 环境变量选择配置文件。

const path = require('path');

module.exports = {
  development: {
    client: 'mysql',
    connection: {
      host: 'localhost',
      user: 'root',
      password: '',
      database: 'SQL_Data',
    },
    migrations: {
      directory: path.join(__dirname, '/server/SQL/migrations'),
    },
    seeds: {
      directory: path.join(__dirname, '/server/SQL/seeds'),
    },
  },
};

在你的 mysql_db 你可能想做这样的事情来初始化 knex 能够使用相同的配置:

const knex = require('knex')(
  require('knexfile')[process.env.NODE_ENV || 'development']
);

【讨论】:

  • 完美,解决了!我这样做是因为在运行knex init 时,这是knexfile.js 附带的代码结构作为格式的示例,在连接键处要求对象内的文件名键。
猜你喜欢
  • 1970-01-01
  • 2015-10-07
  • 2018-02-09
  • 2013-07-27
  • 2013-11-28
  • 2018-02-22
  • 2016-12-27
  • 2012-06-17
相关资源
最近更新 更多