mysql node.js

MySQL 8.0: el cliente no admite el protocolo de autenticación solicitado por el servidor; Considere actualizar el cliente MySQL



node.js (14)

Pasos completos para MySQL 8

Conectarse a MySQL

$ mysql -u root -p Enter password: (enter your root password)

Restablecer su contraseña

(Reemplace your_new_password con la contraseña que desea usar)

mysql> ALTER USER ''root''@''localhost'' IDENTIFIED WITH mysql_native_password BY ''your_new_password''; mysql> FLUSH PRIVILEGES; mysql> quit

A continuación, intente conectar utilizando el nodo

Soy un principiante en node.js y MySQL y acabo de comenzar a configurar y probar algunos códigos básicos. Sin embargo, no puedo establecer una conexión simple con el servidor por alguna razón. Instalo la nueva base de datos MySQL Community 8.0 junto con Node.JS con la configuración predeterminada.

Este es mi código node.js

var mysql = require(''mysql''); var con = mysql.createConnection({ host: "localhost", user: "root", password: "password", insecureAuth : true }); con.connect(function(err) { if (err) throw err; console.log("Connected!"); });

A continuación se muestra el error encontrado en el símbolo del sistema:

C:/Users/mysql-test>node app.js C:/Users/mysql-test/node_modules/mysql/lib/protocol/Parse r.js:80 throw err; // Rethrow non-MySQL errors ^ Error: ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client at Handshake.Sequence._packetToError (C:/Users/mysql- test/node_modules/mysql/lib/protocol/sequences/Sequence.js:52:14) at Handshake.ErrorPacket (C:/Users/mysql-test/node_mo dules/mysql/lib/protocol/sequences/Handshake.js:130:18) at Protocol._parsePacket (C:/Users/mysql-test/node_mo dules/mysql/lib/protocol/Protocol.js:279:23) at Parser.write (C:/Users/mysql-test/node_modules/mys ql/lib/protocol/Parser.js:76:12) at Protocol.write (C:/Users/mysql-test/node_modules/m ysql/lib/protocol/Protocol.js:39:16) at Socket.<anonymous> (C:/Users/mysql-test/node_modul es/mysql/lib/Connection.js:103:28) at Socket.emit (events.js:159:13) at addChunk (_stream_readable.js:265:12) at readableAddChunk (_stream_readable.js:252:11) at Socket.Readable.push (_stream_readable.js:209:10) -------------------- at Protocol._enqueue (C:/Users/mysql-test/node_module s/mysql/lib/protocol/Protocol.js:145:48) at Protocol.handshake (C:/Users/mysql-test/node_modul es/mysql/lib/protocol/Protocol.js:52:23) at Connection.connect (C:/Users/mysql-test/node_modul es/mysql/lib/Connection.js:130:18) at Object.<anonymous> (C:/Users/mysql-test/server.js: 11:5) at Module._compile (module.js:660:30) at Object.Module._extensions..js (module.js:671:10) at Module.load (module.js:573:32) at tryModuleLoad (module.js:513:12) at Function.Module._load (module.js:505:3) at Function.Module.runMain (module.js:701:10)

He leído algunas cosas como: https://dev.mysql.com/doc/refman/5.5/en/old-client.html https://github.com/mysqljs/mysql/issues/1507

Pero todavía no estoy seguro de cómo solucionar mi problema. Cualquier ayuda sería apreciada: D


Aunque la respuesta aceptada es correcta, prefiero crear un nuevo usuario y luego usar ese usuario para acceder a la base de datos.

create user nodeuser@localhost identified by ''nodeuser@1234''; grant all privileges on node.* to nodeuser@localhost; ALTER USER ''nodeuser''@localhost IDENTIFIED WITH mysql_native_password BY ''nodeuser@1234'';


Ejecutar la siguiente consulta en MYSQL Workbench

ALTER USER ''root''@''localhost'' IDENTIFIED WITH mysql_native_password BY ''password''

Donde root como usuario localhost como su URL y password como contraseña

Intenta conectarte usando el nodo después de hacerlo


En Mysql Latest Dockper Container

ALTER USER root IDENTIFIED WITH mysql_native_password BY ''password'';


La documentación original se puede encontrar aquí: https://dev.mysql.com/doc/dev/connector-nodejs/8.0/

''use strict''; const mysqlx = require(''@mysql/xdevapi''); const options = { host: ''localhost'', port: 33060, password: ''******'', user: ''root'', schema: ''yourconference'' }; mysqlx.getSession(options) .then(session => { console.log(session.inspect()); session.close(); }).catch(err => { console.error(err.stack); process.exit(1); });


Para las instalaciones existentes de mysql 8.0 en mysql de Windows 10,

(1) lanzamiento del instalador,

(2) haga clic en "Reconfigurar" debajo de QuickAction (a la izquierda de MySQL Server), luego

(3) haga clic en siguiente para avanzar a través de las siguientes 2 pantallas hasta llegar

(4) en "Método de autenticación", seleccione "Usar método de autenticación heredado (conservar la compatibilidad con MySQL 5.x"

(5) Sigue haciendo clic hasta que se complete la instalación


Primero dejemos claro lo que está pasando.

MySQL 8 tiene soporte para métodos de autenticación conectables. De forma predeterminada, se usa uno de ellos llamado caching_sha2_password lugar de nuestro antiguo mysql_native_password ( source ). ¡Debería ser obvio que el uso de un algoritmo de cifrado con varios handshakes es más seguro que el paso de contraseña simple que ha estado allí durante 24 años !

Ahora, el problema es mysqljs en Node (el paquete que instala con npm i mysql y lo usa en su código de Node) todavía no es compatible con este nuevo método de autenticación predeterminado de MySQL 8. El problema se encuentra aquí: https://github.com/mysqljs/mysql/issues/1507 y sigue abierto, después de 3 años, a partir de julio de 2019. (ACTUALIZACIÓN de junio de 2019: hay una nueva PR en mysqljs ahora para corregir ¡esta!)

Sus opciones

Opción 1) Bajar la versión "MySQL" para autenticarse usando una antigua "native_password" antigua

Eso es lo que todo el mundo sugiere aquí (p. Ej., La respuesta más arriba ). Simplemente mysql a mysql y ejecute una consulta diciendo que la root está bien usando el antiguo método native_password para la autoetiquetación:

ALTER USER ''root''@''localhost'' IDENTIFIED WITH mysql_native_password ...

Lo bueno es que la vida será simple y aún puedes usar buenas herramientas antiguas como Sequel Pro sin ningún problema . Pero el problema es que no está aprovechando las cosas más seguras (y geniales, lea a continuación) disponibles para usted.

Opción 2) Reemplace el paquete "Nodo" con MySQL Connecter X DevAPI

MySQL X DevAPI para Nodo es un reemplazo para el paquete Mysqljs de Node , proporcionado por http://dev.mysql.com oficiales.

Funciona como un encanto que caching_sha2_password autenticación caching_sha2_password . (Solo asegúrese de usar el puerto 33060 para las 33060 del protocolo X ).

Lo malo es que dejaste nuestro antiguo paquete mysql que todos mysql tan acostumbrados y en el que confían.

¡Lo bueno es que tu aplicación es más segura ahora y puedes aprovechar un montón de cosas nuevas que nuestros viejos amigos no brindaron! Solo revisa el tutorial de X DevAPI y verás que tiene un montón de nuevas características atractivas que pueden ser útiles. Solo tiene que pagar el precio de una curva de aprendizaje, que se espera que venga con cualquier actualización tecnológica. :)

PD. Desafortunadamente, este paquete XDevAPI aún no tiene definición de tipos (comprensible por TypeScript), por lo que si está en escritura de tipos, tendrá problemas. Intenté generar .d.ts usando dts-gen y dtsmake , pero no dtsmake éxito. Así que tenlo en mente.

¡Aclamaciones!


Si encuentra este error pero aún desea usar la versión 8 de MySQL, puede hacerlo indicando al servidor MySQL que use el complemento de autenticación heredado cuando cree la base de datos utilizando Docker.

Por lo tanto, su archivo compuesto se verá así:

# Use root/example as user/password credentials version: ''3.1'' services: db: image: mysql:8.0.15 command: --default-authentication-plugin=mysql_native_password restart: always environment: MYSQL_ROOT_PASSWORD: ''pass'' MYSQL_DATABASE: ''db'' MYSQL_USER: ''user'' MYSQL_PASSWORD: ''pass'' ports: - 3318:3306 # Change this to your local path volumes: - ~/Database/ORM_Test:/var/lib/mysql


Si la línea de comando ALTER USER ... no funciona para usted Y si está usando Windows 10, intente seguir estos pasos:

1) Escribe MySQL en la barra de búsqueda de Windows

2) Abra el MySQL Windows Installer - Comunidad

3) Busque el "servidor MySQL" y haga clic en Reconfigurar

4) Haga clic en "Siguiente" hasta que llegue a la fase de "Método de autenticación"

5) En la fase "Método de autenticación", marque la segunda opción "Usar método de autenticación heredado"

6) Luego siga los pasos dados por el instalador de Windows hasta el final

7) Cuando haya terminado, vaya a "Servicios" en la barra de búsqueda de Windows, haga clic en "iniciar" MySql81 ".

Ahora, vuelva a intentarlo, ¡la conexión entre MySQL y Node.js debería funcionar!


Simplemente ejecute MySQL Server Installer y reconfigure My SQL Server ... Esto funcionó para mí.


Tengo MYSQL en el servidor y la aplicación nodejs en otro servidor

Ejecutar la siguiente consulta en MYSQL Workbench

ALTERE AL USUARIO ''root'' @ ''%'' IDENTIFICADO CON mysql_native_password POR ''password''


Tengo el mismo problema con MySQL y resuelvo utilizando XAMPP para conectarme con MySQL y detener los servicios en windows para MySQL (panel de control - Herramientas administrativas - Servicios), y en la carpeta db.js (responsable de la base de datos) I deja la contraseña en blanco (aquí puedes ver :)

const mysql = require(''mysql''); const connection = mysql.createConnection({ host: ''localhost'', user: ''root'', password: '''' });


Usando el antiguo mysql_native_password funciona:

ALTER USER ''root''@''localhost'' IDENTIFIED WITH mysql_native_password BY ''YourRootPassword''; -- or CREATE USER ''foo''@''%'' IDENTIFIED WITH mysql_native_password BY ''bar''; -- then FLUSH PRIVILEGES;

Esto se debe a que caching_sha2_password se introdujo en MySQL 8.0, pero la versión Node.js aún no está implementada. Puede ver esta solicitud de extracción y este problema para obtener más información. Probablemente una solución vendrá pronto!


Verifique los privilegios y el nombre de usuario / contraseña de su usuario de MySQL.

Para detectar errores, siempre es útil utilizar el método _delegateError . En tu caso esto tiene que verse como:

var mysql = require(''mysql''); var con = mysql.createConnection({ host: "localhost", user: "root", password: "password", insecureAuth : true }); var _delegateError = con._protocol._delegateError; con._protocol._delegateError = function(err, sequence) { if (err.fatal) console.trace(''MySQL fatal error: '' + err.message); return _delegateError.call(this, err, sequence); }; con.connect(function(err) { if (err) throw err; console.log("Connected!"); });

Esta construcción te ayudará a rastrear errores fatales.