PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

La connexion à postgres à partir de tapuscrit se bloque

AVIS

TLDS ! (TOO LONG DO SKIM) ! La réponse est longue et riche ! Vous pouvez parcourir ! C'est bien formaté !

Si vous êtes très pressé !Vous pouvez cocher Authentifier section, Sequelize-typescript (not sequelize) section, Sequelize-typescript rubrique.

Et mieux vous pouvez y aller directement en ENFER section! Apprenez à connaître nodejs v14 HELL ! (Allez directement à la fin ! Enfin un peu au dessus).

Vérifiez également FIX (Postgres v14 HELL)

J'ai commencé et avant de savoir je me suis retrouvé à trop écrire !

SUPER GUIDE

En gros sequelize ne doit pas se contenter d'accrocher ! Mais lancez une erreur !

Regarder le code source

En regardant sync code ici

 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;
  }

On voit facilement les possibilités d'accrochage !

Journalisation

Pour déboguer de telles anomalies, il est tout d'abord important d'avoir une bonne journalisation !

Et vous pouvez vérifier comment ajouter la journalisation ici ! Même si normalement sequelize a la journalisation de la requête activée par défaut !

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

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
});

Vérifier l'authentification

Si ce n'est pas le cas, la journalisation se produit ! Cela peut signifier que sequelize n'a rien fait et qu'il est suspendu au début ! Pour tester l'authentification et si la connexion fonctionne !

Vous pouvez tester avec authentification :

https://sequelize.org/master/manual/getting -started.html#testing-the-connection

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 vous n'obtenez aucune journalisation! Et Gonna authenticate imprimé juste ok! Ensuite, le processus est suspendu à authenticate . Ce qui suggère un problème d'authentification !

Vérifiez vos identifiants

Assurez-vous de ne pas avoir fait d'erreur !

Vérifier la connectivité depuis psql ou un autre client externe

  • Si ça ne marche pas ! Cela suggère un problème avec le serveur postgres! Ou une configuration !
  • Si ça marche ! Alors le problème est dans nodejs ! Et votre programme !

N'OUBLIEZ PAS D'INSTALLER LE PILOTE POSTGRES (ou votre pilote db)

Selon la doc :https://sequelize.org/master/manual/ getting-started.html#installation

# 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

Une des commandes ! Assurez-vous de ne pas l'avoir oublié !

Comprendre ce qui se passe et mieux déboguer ! (journalisation du code source)

La meilleure façon de déboguer! Et déterminez vraiment où se situe le problème ! Est en ajoutant des journaux au code source lui-même ! Un moyen rapide pour moi, c'est de le faire directement sur node_modules . J'ai ouvert git sur sequelize repo! Faites une recherche! Détermination du lieu de sync , authenticate , query ! Tous résident dans sequelize.js ! vous pouvez vérifier ici ! On peut CTRL + F pour accéder aux méthodes > authenticate( [ajouter le ( ]. De toute façon! Vous pouvez faire la même chose dans node_modules ! Et commencez à ajouter des journaux ! Vous saurez dans quelle partie le problème se produit ! Ce qui vous aide à déboguer le problème !

L'autre façon est de fourcher ! Et utilisez votre fourchette ! Et travaillez mieux !

Mais mmmm ! node_modules est un moyen rapide ! Vous pouvez prendre une copie ! aussi! Pour être sûr de ne pas perdre vos bûches ! Une fois que vous mettez à jour! À la fin propre en supprimant simplement tout le module ! Et réinstallez ! Ou inversez simplement la création des journaux (annuler) ! Je trouve que c'est un moyen intéressant pour le débogage !

Mais cela devrait renvoyer une erreur

Normalement ça devrait! En voyant le code source, vous pouvez en savoir plus ! Normalement, une erreur devrait être renvoyée ! Mais si un processus se bloque ! Et aucune erreur n'est renvoyée ! Alors vous pouvez vous attendre à un résultat comme celui-ci ! Ici, cela peut être le pilote manquant! Assurez-vous également que console.log . Fonctionne bien ! Et la dernière chose ! MMM est peut-être un problème avec nodejs lui-même (voir la dernière section).

J'utilise sequelize-typescript (pas sequelize)

Très important à savoir ! Sequelize-typescript n'est qu'un wrapper de séquelle ! C'était là pour ajouter la prise en charge de la dactylographie ! Il fournit des décorateurs et quelques fonctionnalités! Aussi à partir de sequelize v5 ! Typescript est pris en charge directement dans sequelize ! Voir icihttps://sequelize.org/master/manual/typescript.html sequelize-typescript dans la dernière version ! Tourné pour utiliser aussi les types de déclaration natifs de sequelize !

Comme sequelize-typecript wrap sequelize! Assurez-vous de vérifier la documentation séquentielle !

A noter aussi qu'il y a des gens qui crient :N'utilisez pas de décorateurs ! mmmm ! mmm ! Et un autre mmmm !

Sequelize-typescript

Si vous utilisez sequelize-typescript, assurez-vous que la version de sequelize-typescript et sequelize faire correspondre ! Selon la doc V5 de séquelle ! Je suppose que V6 aussi devrait faire! Et v1 pour sequelize-typescript !

npm install [email protected] [email protected]

Et n'oubliez pas les packages dactylographiés nécessaires selon la doc !
https:/ /www.npmjs.com/package/sequelize-typescript

(Vous pouvez vérifier et vérifier toutes ces informations dans le document lui-même)

Pourquoi utiliser sequelize-typescript ?

Comme déjà mentionné ! Sequelize a un support natif pour le tapuscrit à partir de V5 . Selon ici . Alors pourquoi utiliser un emballage au-dessus ! Qui utilisent aussi des décorateurs ! (Je ne suis pas contre les décorateurs ! Certains le sont ! Selon ici )

Demandez-vous pourquoi ? Y a-t-il quelque chose à séqueller-dactylographié ! Un plus important par rapport à la méthode native ? S'il y a des choses claires! Merci de les mentionner dans les commentaires ! Et je mettrai à jour ! Cette rubrique !

Et sinon! Le natif peut être bien meilleur ! Une dépendance ou plusieurs en moins !

Configuration du projet

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/**/*"
    ]
}

Ce sont les deux choses importantes à ajouter.

"experimentalDecorators": true,
"esModuleInterop": true

Mais cela ne devrait pas être votre problème ! Sinon, le projet générera des erreurs de compilation !

ENFER

Node js VERSION (V14 HELL)

Et ouais! Cela peut être la cause ! Vous avez peut-être déjà utilisé pour le faire fonctionner bien avant! Et puis dans un nouvel ordinateur ou environnement ! Ça ne marche plus !

La version du nœud peut être le problème ! Nœud v15 et Noeud v14 ! C'est un problème connu ! J'ai moi-même rencontré une fois avec knex.js et postgres (knex.js est un générateur de requêtes) ! Vous voyez donc que c'est lié ! Dans mon histoire, le code fonctionnait bien sur mon ordinateur portable et sur les anciens vps que nous avons déployés ! Mais ensuite, j'ai déployé sur un RDP Windows ! Et mmm ! Boom! Puis j'ai tiré mes cheveux pendant un certain temps! J'ai réfléchi et vérifié ! Il n'y a pas eu de changement ! Et puis je suis venu à hé! Je n'ai mis à jour que nodejs ! Et plus tard, j'ai découvert que d'autres personnes avaient rencontré la même chose ! Bref! Tout a commencé sur nodejs v14 (j'appelle ça v14 HELL ) ! Vous pouvez vérifier ma réponse à ce sujet ici

Et apparemment, le même problème est toujours là avec nodejs v15 !

Dans la question de ce fil! Nous l'avons confirmé ! Dans mon bureau, tout a bien fonctionné ! Nodejs v12 ! Et avec mon ami ordinateur ! Ce n'est pas le cas ! nodejs v14 et nodejs v15 . Ensuite, je voulais confirmer! J'ai installé nodejs v15 Et caboum ! BINGO ! L'exécution s'arrête de manière inattendue ! Pas de journalisation ! Pas d'erreur! En v12 ! Tout fonctionnait correctement ! j'ai eu des erreurs au début puis je les ai corrigées! Et le serveur était opérationnel ! Et séquelle connecté à la BD !

Voici les exécutions

V12 et v13

J'affiche la v13 ! La même chose se produit avec la 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 :)

Fonctionnement cool sans problème

Exécution V14 et 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  

Et hop ! Le programme se ferme de manière inattendue sans sortie d'erreur !

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  

Et oppsii encore! Le programme se ferme de manière inattendue sans sortie d'erreur !

Il n'y a pas non plus de différence entre v14 et v15 ! C'est V14 HELL .

En bref

Le V14 ENFER est une cause connue et très probable ! Il y a un problème avec pg module je suppose ! Quelque chose a changé sur v14 et a causé ce problème !

Bref bref ! Si rien n'a de sens ! Et si votre même code fonctionnait avant ! Première chose à faire ! Est de vérifier avec nodejs v13 ou v12 ! Cela peut vous sauver de la folie ! Qui dirait que la version de nodejs et une nouvelle créeront un tel problème !

Quel est ce problème ! Qu'est-ce que V14 HELL dans nodejs ?

Si comme moi vous aimez connaître les détails et ce qui s'est passé !?

Avec le nœud V14 ! Quelques changements de rupture se sont produits sur l'API ! De plus, beaucoup de choses ont été modifiées! Y compris la version OpenSSL !

Pour les postgres ! Et pg module! Le problème était tel que décrit dans ce commentaire par ce thread :

Et selon ce PR !

Vous pouvez voir les changements dans cette différence

En bref comme mentionné! Le comportement de onReadySate changé pour net.Socket !Et la solution implémentée était de ne pas utiliser onReadyState du tout !

Et selon ceci

Vérifiez cette ligne

Dans l'ancienne version, la connexion n'était appelée que si le socket était sur closed Etat! readyState l'utilisation est éliminée !

Tu peux comprendre! Selon la mise en œuvre! Beaucoup de choses peuvent ou non être affectées par ces changements fondamentaux !

Modifications de nœud pertinentes

Et parce que je voulais voir où le changement se produisait ! Voilà, vous pouvez vérifier

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

On peut également consulter le journal des modifications :

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

RÉPARER (Postgres v14 HELL)

Selon ma réponse ici .

Mettre à jour pg pilote vers >=8.0.3 ! Vous pouvez simplement passer à la version la plus récente !

npm install [email protected] --save

Et vous pouvez vérifier notre problème en question

Ancienne version à v7

Mise à jour vers v8

Exécution à nouveau avec node v15

Taraaaaa ! Et cela a fonctionné à merveille !

Et si vous n'utilisez pas postgres ! Et le problème était v14 HELL ! Signification Vous avez testé avec v13 . Et ça a marché ! Essayez ensuite de mettre à niveau votre pilote db vers la dernière version !

Pourquoi nœud v14 + sortie et pas d'erreur de journalisation

Aussi pour mentionner les changements de rupture! Fait pg faire sortir le processus à connect() call . Et c'est ce qui l'a fait sortir ! Et l'exploitation forestière était à voir ! Plus en détail pour cela ! Voici comment cela s'est passé ! Sequelize a l'implémentation du dialecte postgres ! Qui utilisent pg! Et pg client ! créer une connexion! La connexion a un connect un événement! Quand il se connecte, il l'émet! Et parce que le nœud v14 change le comportement en commençant par open ! La connexion au flux est ignorée ! Et le flux est considéré comme connecté ! Où il n'y en a pas ! Et le connect événement est émis directement ! Quand ça arrive ! Le client appellera soit requestSsl() ou startup() méthode de l'objet de connexion ! Et les deux appelleront this._stream.write . parce que le flux n'est pas connecté! Une erreur s'est produite ! Cette erreur n'est pas prise! Alors la promesse de sequelize driver ! Restera non résolu! Et puis la boucle d'événements se vide ! Nodejs par comportement par défaut, il suffit de quitter !

Vous pouvez voir le pas à pas à travers les lignes de code :

Pourquoi nodejs sort (promesses non résolues)

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

Le nœud se termine sans erreur et n'attend pas la promesse (rappel d'événement)

que se passe-t-il lorsqu'une promesse ne se résout jamais ?

NVM

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

Si vous ne savez pas ce que nvm est! Ou vous n'utilisez pas nvm . Pensez à l'utiliser ! Comme c'est un outil très intéressant ! Nvm est un outil de gestion de version de nœud !

Avec nvm changeant, déboguant et testant vers et avec différentes versions de nodejs ! Est rapide et un jeu d'enfant! Et donc installer les nouvelles versions de nodejs en parallèle !

Remarque sur sequelize.sync()

Ne l'utilisez pas pour la production ! Ou pas du tout ! (La plupart des ORM ! Et le générateur de requêtes (knex.js) utilise des migrations).

https://sequelize.org/master/manual/model -basics.html#synchronisation-en-production

De la doc