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 :
- Sequelize pg adapter va appelez le client pg pour créer une connexion et la promesse
- pg client call connect sur un objet de connexion
- connexion pg
connect()
appeler et émettreconnect
! Je pense que le flux est connecté à cause du changement de V14 - pg client
connect
événement attrapé et rappel exécuté !requestSsl()
oustartup()
sera exécuté - L'une des méthodes est exécutée et
stream.write
sera appelé (requestSsl() , démarrage() ) - Erreur de flux (non interceptée)
- Promesse dans l'adaptateur postgres sequelize ! Toujours pas résolu !
- boucle d'événement vide => Nodejs => Quitter
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
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