sql >> Base de Datos >  >> RDS >> PostgreSQL

La conexión a postgres desde mecanografiado se bloquea

AVISO

TLDS! (¡DEMASIADO LARGO HACER DESMATAR)! ¡La respuesta es larga y rica! ¡Puedes hojear! ¡Está bien formado!

Si tienes mucha prisa !Puede marcar Autenticar sección, Sequelize-typescript (no sequelize) sección, Sequelize-typescript sección.

Y mejor puedes ir directamente al INFIERNO ¡sección! Conozca nodejs v14 INFIERNO ! (¡Ir directamente al final! Pues un poco más arriba).

Compruebe también FIX (Postgres v14 HELL)

¡Empecé y antes de darme cuenta me encontré escribiendo demasiado!

SÚPER GUÍA

¡Básicamente, la secuela no debería simplemente colgar! ¡Pero lanza un error!

Mirando el código fuente

Mirando sync código aquí

 async sync(options) {
    // ...

    // no models defined, just authenticate
    if (!models.length) {
      await this.authenticate(options);
    } else {
      for (const model of models) await model.sync(options);
    }
    if (options.hooks) {
      await this.runHooks('afterBulkSync', options);
    }
    return this;
  }

¡Uno puede ver fácilmente las posibilidades de colgar!

Registro

Para depurar tales anomalías, en primer lugar, es importante tener un buen registro. !

¡Y puede consultar cómo agregar el registro aquí! ¡Aunque normalmente las secuencias tienen el registro de la consulta activado por defecto!

https://sequelize.org/master/manual/getting-started.html #registro

const sequelize = new Sequelize('sqlite::memory:', {
  // Choose one of the logging options
  logging: console.log,                  // Default, displays the first parameter of the log function call
  logging: (...msg) => console.log(msg), // Displays all log function call parameters
  logging: false,                        // Disables logging
  logging: msg => logger.debug(msg),     // Use custom logger (e.g. Winston or Bunyan), displays the first parameter
  logging: logger.debug.bind(logger)     // Alternative way to use custom logger, displays all messages
});

Comprobar la autenticación

¡Si no ocurre el registro! ¡Eso puede significar que la secuela no hizo nada y solo está colgando al principio! ¡Para probar la autenticación y si la conexión funciona!

Puedes probar con autenticar :

https://sequelize.org/master/manual/getting -started.html#probando-la-conexión

try {
  console.log('Gonna authenticate'); // <== to make sure console.log is working and not overrided!
  await sequelize.authenticate();
  console.log('Connection has been established successfully.');
} catch (error) {
  console.error('Unable to connect to the database:', error);
}

Si no obtiene registro! Y Gonna authenticate impreso simplemente bien! Entonces el proceso está pendiente de autenticar . ¡Lo que sugiere un problema en la autenticación!

Verifique sus credenciales

¡Asegúrate de no cometer ningún error!

Verifique la conectividad desde psql o algún otro cliente externo

  • ¡Si no funciona! ¡Sugiere un problema con el servidor postgres! ¡O alguna configuración!
  • ¡Si funciona! ¡Entonces el problema está en nodejs! ¡Y tu programa!

NO OLVIDE INSTALAR EL CONTROLADOR POSTGRES (o su controlador db)

Según el documento:https://sequelize.org/master/manual/ introducción.html#instalación

# One of the following:
$ npm install --save pg pg-hstore # Postgres
$ npm install --save mysql2
$ npm install --save mariadb
$ npm install --save sqlite3
$ npm install --save tedious # Microsoft SQL Server

Uno de los comandos! ¡Asegúrate de no olvidarlo!

¡Comprender lo que sucede y depurar mejor! (registro de código fuente)

¡La mejor manera de depurar! ¡Y determine realmente dónde está ocurriendo el problema! Es agregando registros al código fuente ¡sí mismo! Una manera rápida para mí es hacer eso directamente en node_modules . ¡Abrí git en el repositorio de secuelas! Hice una búsqueda! Determinado el lugar de sync , authenticate , query ! Todos residen en sequelize.js ! puedes consultar aquí ! Uno puede CTRL + F para llegar a los métodos > authenticate( [añadir el ( ]. ¡De todos modos! Puedes hacer lo mismo en node_modules ! ¡Y comience a agregar registros! ¡Sabrás en qué parte está ocurriendo el problema! ¡Lo que te ayuda a depurar el problema!

La otra forma es bifurcar ! ¡Y usa tu tenedor! ¡Y simplemente trabaja mejor!

Pero mmm! node_modules es una forma rápida ! Puedes tomar una copia ! ¡también! ¡Para asegurarse de no perder sus registros! ¡Una vez que actualices! Al final limpiar ¡simplemente eliminando todo el módulo! ¡Y reinstalar! ¡O simplemente invierta la creación de registros (deshacer)! ¡Me parece una forma interesante de depurar!

Pero debería arrojar un error

¡Normalmente debería! ¡Al ver el código fuente puedes saberlo mejor! ¡Normalmente se debe lanzar un error! ¡Pero si un proceso se ahorca! ¡Y no se arroja ningún error! ¡Entonces puedes esperar un resultado como este! ¡Aquí puede ser que falte el conductor! También asegúrese de que console.log . ¡Está funcionando bien! ¡Y lo último! MMM puede ser un problema con nodejs mismo (ver la última sección).

Estoy usando secuencias mecanografiadas (no secuencias)

¡Muy importante saberlo! ¡Sequelize-typescript es solo un envoltorio de secuencia! ¡Eso estaba allí para agregar soporte de mecanografiado! ¡Proporciona decoradores y algunas características! ¡También de Sequelize v5! ¡Mecanografiado es compatible directamente con Sequelize! Consulte aquí https://sequelize.org/master/manual/typescript.html Sequelize-typescript en la última versión! ¡Pasé a usar también los tipos de declaración nativos de secuela!

Como sequelize-typecript wrap sequelize! ¡Asegúrese de verificar la documentación de secuela!

Tenga en cuenta también que hay algunas personas gritando :¡No utilices decoradores! mmmm! ¡mmm! ¡Y otro mmmm! https://stackoverflow.com/a/60369189/7668448

Sequelize-typescript

Si está utilizando secuencias mecanografiadas, asegúrese de que la versión de sequelize-typescript y sequelize hacer coincidir ! Según el documento V5 de secuela! Supongo que V6 también debería hacer! Y v1 para secuenciar-mecanografiado!

npm install [email protected] [email protected]

¡Y no olvide los paquetes necesarios de mecanografiado según el documento!
https:/ /www.npmjs.com/package/sequelize-typescript

(Puede consultar y verificar toda esa información en el propio documento)

¿Por qué usar secuencias mecanografiadas?

Como ya se mencionó! Sequelize tiene soporte nativo para mecanografiado a partir de V5 . Según aquí . Entonces, ¿por qué usar un envoltorio encima? ¡Eso también lo usan los decoradores! (¡No estoy en contra de los decoradores! ¡Algunos lo están! Según aquí )

Pregúntate ¿por qué? ¡Hay algo para secuenciar-mecanografiado! ¿Una ventaja importante en comparación con la forma nativa? Si hay cosas claras! ¡Por favor, menciónalos en los comentarios! ¡Y actualizaré! ¡Esta sección!

¡Y si no! Nativo puede ser mucho mejor! ¡Una dependencia o muchas en menos!

Configuración del proyecto

tsconfig!

{
    "compilerOptions": {
        "module": "commonjs",
        "target": "es6",
        "moduleResolution": "node",
        "rootDir": "./src",
        "outDir": "./dist",
        "lib": [
            "es2015",
            "es2016",
            "dom"
        ],
        "declaration": true,
        "experimentalDecorators": true,
        "esModuleInterop": true
    },
    "include": [
        "src/**/*"
    ],
    "exclude": [
        "node_modules/**/*",
        "src/**/*.test.tsx",
        "src/**/*.story.tsx",
        "test/**/*"
    ]
}

Esas son las dos cosas importantes para agregar.

"experimentalDecorators": true,
"esModuleInterop": true

¡Pero ese no debería ser tu problema! ¡De lo contrario, el proyecto arrojará errores de compilación!

INFIERNO

VERSIÓN Node js (V14 INFIERNO)

¡Y sí! ¡Esa puede ser la causa! ¡Es posible que ya lo hayas hecho funcionar bien antes! ¡Y luego en una nueva computadora o entorno! Ya no funciona !

La versión del nodo puede ser el problema ! Nodo v15 y Nodo v14 ! ¡Ese es un problema conocido! Yo mismo me encontré una vez con knex.js y postgres (knex.js es un generador de consultas)! ¡Así que puedes ver que está relacionado! ¡En mi historia, el código funcionaba bien en mi computadora portátil y en los vps antiguos que implementamos! ¡Pero luego lo implementé en un rdp de Windows! ¡Y mmm! ¡Auge! ¡Entonces me tiré del pelo durante algún tiempo! ¡Reflexioné y comprobé! ¡No hubo ningún cambio! Y luego vine a ¡oye! ¡Solo actualicé nodejs! ¡Y luego descubrí que otras personas encontraron lo mismo! ¡En breve! Todo comenzó en nodejs v14 (Llamo a esto v14 INFIERNO )! Puedes consultar mi respuesta al respecto aquí

Y aparentemente el mismo problema siempre está ahí con nodejs v15 !

En la pregunta de este hilo! ¡Lo confirmamos! ¡En mi escritorio todo funcionó bien! Nodejs v12 ! Y con mi amiga computadora! ¡No fue así! nodejs v14 y nodejs v15 . ¡Entonces quería confirmar! Instalé nodejs v15 ¡Y caboom! ¡BINGO! ¡La ejecución simplemente se detiene inesperadamente! ¡Sin registro! ¡No hay error! En v12 ! ¡Todo funcionaba correctamente! al principio tuve errores y luego los corregí! ¡Y el servidor estaba funcionando! ¡Y secuenciar conectado a la base de datos!

Aquí las ejecuciones

V12 y v13

Estoy mostrando v13! ¡Lo mismo sucede con v12!

nvm use v13
Now using node v13.14.0 (npm v6.14.4)
 [email protected]  ~/Documents/coderhero/Dev/projects/Fahima-ecommerce   LuckyLook  npm run dev 

> [email protected] dev /home/coderhero/Documents/coderhero/Dev/projects/Fahima-ecommerce
> npx ts-node-dev src/server.ts

[INFO] 01:49:29 ts-node-dev ver. 1.0.0 (using ts-node ver. 9.0.0, typescript ver. 4.0.5)
config ::::
{
  username: 'fahima',
  password: '123456',
  database: 'fahimashop',
  host: 'localhost',
  dialect: 'postgres'
}
hi there ::::
Executing (default): SELECT 1+1 AS result
connection established
Executing (default): CREATE TABLE IF NOT EXISTS "Products" ("id"   SERIAL , "brand" TEXT, "price" DECIMAL, "description" VARCHAR(255), "imgUrl" VARCHAR(255), "category" VARCHAR(255), "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "updatedAt" TIMESTAMP WITH TIME ZONE NOT NULL, PRIMARY KEY ("id"));
Executing (default): SELECT i.relname AS name, ix.indisprimary AS primary, ix.indisunique AS unique, ix.indkey AS indkey, array_agg(a.attnum) as column_indexes, array_agg(a.attname) AS column_names, pg_get_indexdef(ix.indexrelid) AS definition FROM pg_class t, pg_class i, pg_index ix, pg_attribute a WHERE t.oid = ix.indrelid AND i.oid = ix.indexrelid AND a.attrelid = t.oid AND t.relkind = 'r' and t.relname = 'Products' GROUP BY i.relname, ix.indexrelid, ix.indisprimary, ix.indisunique, ix.indkey ORDER BY i.relname;
server running http://localhost:8100
press CTRL+C to stop server, please :)

Genial trabajando sin problema

Ejecución de V14 y v15

v14

 [email protected]  ~/Documents/coderhero/Dev/projects/Fahima-ecommerce   LuckyLook  node -v        
v14.15.0
 [email protected]  ~/Documents/coderhero/Dev/projects/Fahima-ecommerce   LuckyLook  npm run dev

> [email protected] dev /home/coderhero/Documents/coderhero/Dev/projects/Fahima-ecommerce
> npx ts-node-dev src/server.ts

[INFO] 02:07:35 ts-node-dev ver. 1.0.0 (using ts-node ver. 9.0.0, typescript ver. 4.0.5)
config ::::
{
  username: 'fahima',
  password: '123456',
  database: 'fahimashop',
  host: 'localhost',
  dialect: 'postgres'
}
hi there ::::
 [email protected]  ~/Documents/coderhero/Dev/projects/Fahima-ecommerce   LuckyLook  

Y ¡ay! ¡El programa se está cerrando inesperadamente sin generar ningún error!

V15

 [email protected]  ~/Documents/coderhero/Dev/projects/Fahima-ecommerce   LuckyLook  nvm use v15    
Now using node v15.0.1 (npm v7.0.3)
 [email protected]  ~/Documents/coderhero/Dev/projects/Fahima-ecommerce   LuckyLook  npm run dev

> [email protected] dev
> npx ts-node-dev src/server.ts

[INFO] 02:10:48 ts-node-dev ver. 1.0.0 (using ts-node ver. 9.0.0, typescript ver. 4.0.5)
config ::::
{
  username: 'fahima',
  password: '123456',
  database: 'fahimashop',
  host: 'localhost',
  dialect: 'postgres'
}
hi there ::::
 [email protected]  ~/Documents/coderhero/Dev/projects/Fahima-ecommerce   LuckyLook  

¡Y oppii otra vez! ¡El programa se está cerrando inesperadamente sin generar ningún error!

Tampoco hay diferencia entre v14 y v15 ! Es V14 HELL .

En resumen

El V14 INFIERNO es una causa conocida y muy probable! Hay un problema con pg módulo supongo! Algo cambió en v14 y causó este problema!

En resumen corto! ¡Si nada tiene sentido! ¡Y si tu mismo código funcionaba antes! ¡Lo primero que hay que hacer! Es verificar con nodejs v13 o v12 ! ¡Eso puede salvarte de la locura! ¡Quién diría que la versión de nodejs y una nueva crearán tal problema!

¿Qué es este problema? ¿Qué es V14 HELL en nodejs?

Si como a mí te gusta saber los detalles y ¿¡qué pasó!?

¡Con nodo V14! ¡Ocurrieron algunos cambios importantes en la API! ¡También se cambiaron muchas cosas! ¡Incluyendo la versión Openssl!

Para postgres! Y pg ¡módulo! El problema se describe en este comentario según este hilo :

Y según este PR !

Puede ver los cambios en esta diferencia

En resumen ¡como se mencionó! El comportamiento de onReadySate cambiado por net.Socket !Y la solución implementada fue no usar onReadyState ¡en absoluto!

Y según esto

Compruebe esta línea

En la versión anterior, se llamaba a la conexión solo si el socket estaba en closed ¡estado! readyState ¡se elimina el uso!

¡Tú puedes entender! Dependiendo de la implementación! ¡Muchas cosas pueden o no verse afectadas por esos cambios fundamentales!

Cambios de nodos relevantes

¡Y porque quería ver dónde ocurría el cambio! Aquí tienes y puedes comprobar

https://github.com/nodejs/node/pull/32272

También se puede consultar el registro de cambios:

https://github.com/nodejs/node/blob /master/doc/changelogs/CHANGELOG_V14.md

FIX (Postgres v14 INFIERNO)

Según mi respuesta aquí .

Actualizar pg controlador a >=8.0.3 ! ¡Simplemente puede actualizar a la última versión!

npm install [email protected] --save

Y puede verificar nuestro problema en cuestión

Versión antigua en v7

Actualizando a v8

Corriendo de nuevo con node v15

Taraaaaa! ¡Y funcionó maravillosamente!

Y si no está usando postgres ! Y el problema era v14 HELL ! Lo que significa que probó con v13 . ¡Y funcionó! ¡Luego intente actualizar su controlador db a la última versión!

Por qué el nodo v14 + sale y no hay error de registro

¡También para mencionar los cambios de última hora! Hecho pg hacer que el proceso salga en connect() call . ¡Y eso es lo que hizo que saliera! ¡Y se vio el registro! ¡Con más detalle para esto! ¡Aquí cómo sucedió! ¡Sequelize tiene la implementación del dialecto de postgres! Que uso pg! Y pg cliente! crea una conexión! La conexión tiene un connect ¡evento! ¡Cuando se conecta lo emite! ¡Y porque el nodo v14 cambia el comportamiento para comenzar con abierto! ¡Se salta la conexión de transmisión! ¡Y la corriente se toma como conectada! ¡Donde no está! Y el connect evento se emite directamente! Cuando eso suceda! El cliente llamará a requestSsl() o startup() método del objeto de conexión! Y ambos llamarán a this._stream.write . porque el stream no está conectado! ¡Ocurrió un error! Este error no es captura! ¡Entonces la promesa en Sequelize Driver! ¡Quedará sin resolver! ¡Y luego el ciclo de eventos se vacía! Nodejs por comportamiento predeterminado simplemente salga!

Puedes ver el paso a través de líneas de código:

Por qué nodejs sale (promesas no resueltas)

https://github.com/nodejs/node/issues/22088

El nodo sale sin error y no espera promesa (devolución de llamada de evento)

¿qué sucede cuando una Promesa nunca se resuelve?

NVM

https://github.com/nvm-sh/nvm

Si no sabe qué nvm ¡es! O no estás usando nvm . ¡Considera usarlo! Ya que es una herramienta muy interesante! Nvm es una herramienta de gestión de versiones de nodos !

Con nvm cambiando, depurando y probando con diferentes versiones de nodejs. Es rápido y una brisa! ¡Y así instalando nuevas versiones de nodejs en paralelo!

Nota sobre sequelize.sync()

No lo use para production ! ¡O en absoluto! (¡La mayoría de ORM! y el generador de consultas (knex.js) usan migraciones).

https://sequelize.org/master/manual/model -basics.html#sincronización-en-producción

Del documento