PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Връзката с postgres от typescript увисва

ИЗВЕСТИЕ

TLDS! (ПРЕКАЛЕНО ДЪЛГО НАПРАВЕТЕ ОБЕЗМАСЯВАНЕ)! Отговорът е дълъг и богат! Можете да обезмаслите! Добре е форматиран!

Ако много бързате !Можете да поставите отметка на Удостоверяване раздел, Sequelize-typescript (не sequelize) раздел, Sequelize-typescript раздел.

И по-добре можете да отидете директно доАДА раздел! Запознайте се с nodejs v14 HELL ! (Отидете директно до края! Е, малко по-горе).

Поставете отметка и FIX (Postgres v14 HELL)

Започнах и преди да разбера, че написах твърде много!

СУПЕР РЪКОВОДСТВО

По принцип секвелизирането не трябва просто да виси! Но подайте грешка!

Разглеждане на изходния код

Като погледнете sync код тук

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

Човек лесно може да види възможностите за окачване!

Регистриране

За отстраняване на грешки при такива аномалии е важно преди всичко да имате добро регистриране !

И можете да проверите как да добавите регистрация тук! Въпреки че обикновено sequelize регистрирането на заявката е активирано по подразбиране!

https://sequelize.org/master/manual/getting-started.html #регистриране

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

Проверете удостоверяването

Ако не се случи регистриране! Това може да означава, че секвелизирането не е направило нищо и просто виси в началото! За да тествате удостоверяването и дали връзката работи!

Можете да тествате с удостоверяване :

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

Ако не получите регистриране! И Gonna authenticate отпечатано е добре! След това процесът виси на удостоверяване . Което предполага проблем с удостоверяването!

Проверете идентификационните си данни

Уверете се, че не сте допуснали грешки!

Проверете връзката от psql или друг външен клиент

  • Ако не работи! Това предполага проблем с postgres сървър! Или някаква конфигурация!
  • Ако проработи! Тогава проблемът е в nodejs! И вашата програма!

НЕ ЗАБРАВЯЙТЕ ДА ИНСТАЛИРАТЕ ДРАЙВЕРА POSTGRES (Или вашия db драйвер)

Според документа:https://sequelize.org/master/manual/ get-started.html#installing

# 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

Една от командите! Уверете се, че не сте забравили това!

Разбиране на случващото се и по-добро отстраняване на грешки! (регистриране на източника на код)

Най-добрият начин за отстраняване на грешки! И наистина определете къде се случва проблемът! Това е чрез добавяне на регистрационни файлове към изходния код себе си! Бързначин за мен е да направя това директно на node_modules . Отворих git на sequelize repo! Направих търсене! Определя мястото на sync , authenticate , query ! Всички се намират в sequelize.js ! можете да проверите тук ! Човек може да CTRL + F, за да стигне до методите > authenticate( [добавете ( ]. Така или иначе! Можете да направите същото в node_modules ! И започнете да добавяте регистрационни файлове! Ще разберете в коя част се случва проблемът! Които ви помагат да отстраните проблема!

Другият начин е сразклонение ! И използвай вилицата си! И просто работете по-добре!

Но ммм! node_modules е бърз начин ! Можете да направите копие ! също! За да сте сигурни, че няма да загубите вашите трупи! След като актуализирате! Накрая почистите като просто премахнете целия модул! И преинсталирайте! Или просто обърнете създаването на регистрационни файлове (отмяна)! Намирам го за интересен начин за отстраняване на грешки!

Но трябва да изведе грешка

Обикновено трябва! Като видите източника на кода, можете да знаете по-добре! Обикновено трябва да се изведе грешка! Но ако процесът бъде обесен! И не се извежда грешка! Тогава можете да очаквате резултат като този! Ето това може да е драйверът, който липсва! Също така се уверете, че console.log . Работи добре! И последното нещо! MMM може да е проблем с nodejs (вижте последния раздел).

Използвам sequelize-typescript (не sequelize)

Много важно да знаете! Sequelize-typescript е просто обвивка на sequelize! Това беше там, за да добави поддръжка на машинопис! Предоставя декоратори и някои функции! Също така от sequelize v5! Typescript се поддържа директно в sequelize! Вижте тукhttps://sequelize.org/master/manual/typescript.html sequelize-typescript в най-новата версия! Оказа се, че използвам и собствените типове декларации на sequelize!

As sequelize-typecript wrap sequelize! Уверете се, че сте проверили документацията за секвелизиране!

Да отбележа също, че има хора, които викат :Не използвайте декоратори! Мммм! ммм! И още един ммм!https://stackoverflow.com/a/60369189/7668448

Sequelize-typescript

Ако използвате sequelize-typescript, уверете се, че версията на sequelize-typescript и sequelize направете съвпадение ! Съгласно там документ V5 на продължаване! Предполагам V6 също трябва да го направя! И v1 за sequelize-typescript!

npm install [email protected] [email protected]

И не забравяйте пакетите, необходими за машинопис, според там документ!
https:/ /www.npmjs.com/package/sequelize-typescript

(Можете да проверите и потвърдите цялата тази информация в самия документ)

Защо да използваме sequelize-typescript?

Както вече споменахме! Sequelize има собствена поддръжка за машинопис, започвайки от V5 . Според тук . Така че защо да използвате обвивка над него! Това също използва декоратори! (Не съм против декораторите! Някои са! Според тук )

Запитайте се защо? Има ли нещо за секвениране-машинопис! Важен плюс в сравнение с родния начин? Ако има ясни неща! Моля, споменете ги в коментарите! И ще актуализирам! Този раздел!

И ако не! Родният може да бъде много по-добър! Зависимост или много в по-малко!

Конфигурация на проекта

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

Това са двете важни неща, които трябва да добавите.

"experimentalDecorators": true,
"esModuleInterop": true

Но това не трябва да е ваш проблем! В противен случай проектът ще генерира грешки при компилиране!

По дяволите

Node js ВЕРСИЯ (V14 HELL)

И да! Това може да е причината! Може вече да сте свикнали да работи добре преди! И след това в нов компютър или среда! Вече не работи !

Проблемът може да е версията на възела ! Възел v15 и Node v14 ! Това е известен проблем! Самият аз се сблъсках веднъж с knex.js и postgres (knex.js е създател на заявки)! Така че можете да видите, че това е свързано! В моята история кодът работеше добре на моя лаптоп и стар vps, в който внедрихме! Но след това разположих на Windows rdp! И ммм! Бум! След това си дърпах косата известно време! Отразих и проверих! Нямаше промяна! И тогава дойдох на хей! Актуализирах само nodejs! И по-късно открих, че други хора са се сблъскали със същото! Накратко! Всичко започна на nodejs v14 (наричам това v14 АДА )! Можете да проверите отговора ми за него тук

И очевидно същият проблем винаги съществува с nodejs v15 !

Във въпроса на тази тема! Ние потвърдихме това! В моя работен плот всичко работи добре! Nodejs v12 ! И то с моя приятел компютър! Не стана! nodejs v14 и nodejs v15 . Тогава исках да потвърдя! Инсталирах nodejs v15 И бум! БИНГО! Изпълнението просто спира неочаквано! Без регистриране! Няма грешка! В v12 ! Всичко работеше правилно! първо имах грешки, после ги коригирах! И сървърът беше готов! И секвелизирайте свързан към DB!

Ето екзекуциите

V12 и v13

Показвам v13! Същото се случва и с 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 :)

Страхотно работи без проблем

Изпълнение на V14 и 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  

И опс! Програмата излиза неочаквано без грешка!

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  

И отново oppsii! Програмата излиза неочаквано без грешка!

Няма разлика и между v14 и v15 ! Това е V14 HELL .

Накратко

V14 HELL е известна и много вероятна причина! Има проблем с pg модул предполагам! Нещо се промени на v14 и причини този проблем!

Накратко накратко! Ако нищо няма смисъл! И ако същият ви код е работил преди! Първото нещо, което трябва да направите! Трябва да проверите с nodejs v13 или v12 ! Това може да ви спаси от лудост! Кой би казал, че версията на nodejs и нова ще създадат такъв проблем!

Какъв е този проблем! Какво е V14 HELL в nodejs?

Ако като мен искате да знаете подробностите и какво се случи!?

С възел V14! В API се случиха някои критични промени! Освен това много неща бяха променени! Включително Openssl версия!

За postgres! И pg модул! Проблемът беше както е описано в този коментар за тази нишка :

И според този PR !

Можете да видите промените в тази разлика

Накратко както е споменато! Поведението за onReadySate променен за net.Socket !И внедреното решение беше да не се използва onReadyState изобщо!

И според това

Проверете този ред

В по-старата версия връзката се извикваше само ако сокетът е closed държава! readyState използването е елиминирано!

Можете да разберете! В зависимост от изпълнението! Много неща могат или не са засегнати от тези основни промени!

Съответни промени в възлите

И защото исках да видя къде се случва промяната! Ето ви и можете да проверите

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

Човек може да провери и регистъра на промените:

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

КОРЕКЦИЯ (Postgres v14 HELL)

Според моя отговор тук .

Надстройте pg драйвер за >=8.0.3 ! Можете просто да надстроите до най-новото!

npm install [email protected] --save

И можете да проверите за въпросния ни проблем

Стара версия на v7

Актуализиране до v8

Работи отново с node v15

Тараааа! И работи страхотно!

И ако не използвате postgres ! И проблемът беше v14 HELL ! Което означава, че тествахте с v13 . И се получи! След това опитайте да надстроите вашия db драйвер до най-новия!

Защо възел v14 + изход и без грешка при регистриране

Също така да споменем разбиващите промени! Направено pg накарайте процеса да излезе при connect() call . И това го накара да излезе! И сечта трябваше да се види! По-подробно за това! Ето как се случи! Sequelize имат внедряването на диалекта на postgres! Които използват pg! И pg клиент! създайте връзка! Връзката има connect събитие! Когато се свърже, го излъчва! И тъй като възел v14 променя поведението на започване с отворен! Връзката с потока е пропусната! И потокът се приема като свързан! Където го няма! И connect събитието се излъчва директно! Когато това стане! Клиентът или ще извика requestSsl() или startup() метод на свързващия обект! И двете ще извикат this._stream.write . защото потокът не е свързан! Случва се грешка! Тази грешка не е улов! Тогава обещанието в драйвера за последователност! Ще остане неразрешено! И тогава цикълът на събитията се изпразва! Nodejs по подразбиране просто излиза!

Можете да видите стъпката през редове код:

Защо nodejs излизат (неразрешени обещания)

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

Възелът излиза без грешка и не чака обещание (обратно извикване на събитие)

какво се случва, когато Promise никога не бъде разрешен?

NVM

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

Ако не знаете какво е nvm е! Или не използвате nvm . Помислете за използването му! Тъй като това е много интересен инструмент! Nvm е инструмент за управление на версията на възел !

С промяна на nvm, отстраняване на грешки и тестване към и с различна версия на nodejs! Бързо и леко! И така инсталиране на нови версии на nodejs паралелно!

Забележка относно sequelize.sync()

Не го използвайте за production ! Или изобщо! (Повечето ORM! И инструментът за създаване на заявки (knex.js) използват миграции).

https://sequelize.org/master/manual/model -basics.html#synchronization-in-production

От документа




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Проверете дали съществува поле в колона тип json PostgreSQL

  2. Cloud9 постгрес

  3. Как да използвате смесени int и числови аргументи във функция на Postgres 9.1+

  4. Как да съпоставим елементи в масив от съставен тип?

  5. Spring Batch - Не може да се създадат таблици с метаданни на Postgres и да се заредят действителни данни в mysql