Typecript askıda kalıyor postgres bağlantısı
Typcript'ten bir Postgres veritabanına bağlanmaya çalışıyorum. sequelize-typescriptORM olarak kullanıyorum . Benim sorunum, komut dosyasının takılıp kalması await sequelize.sync();. İşte sequelize.tsdosya:
import {Sequelize} from 'sequelize-typescript';
import { config } from './config/config';
const c = config.dev;
// Instantiate new Sequelize instance!
export const sequelize = new Sequelize({
"username": c.username,
"password": c.password,
"database": c.database,
"host": c.host,
dialect: 'postgres',
storage: ':memory:',
});
Ve işte model sınıf dosyası Product.ts:
import {Table, Column, Model, HasMany, PrimaryKey, CreatedAt, UpdatedAt, ForeignKey} from 'sequelize-typescript';
@Table
export class Product extends Model<Product> {
@Column
public brand: string;
@Column
public price: number;
@Column
public description!: string;
@Column
public imgUrl!: string;
@Column
public cateogry: string;
}
İşte devam server.tsettirmeyi kullandığım yer:
(async () => {
await sequelize.addModels(V0MODELS);
//It get's stuck here
await sequelize.sync();
const app = express();
const port = 8100; // default port to listen
app.use(bodyParser.json());
app.use(function(req, res, next) {
res.header("Access-Control-Allow-Origin", "http://localhost:8100");
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, Authorization");
next();
});
app.use('/api/v0/', IndexRouter);
// Root URI call
app.get( "/", async ( req, res ) => {
res.send( "/api/v0/" );
} );
// Start the Server
app.listen( port, () => {
console.log( `server running http://localhost:${ port }` );
console.log( `press CTRL+C to stop server, please :)` );
} );
})();
Ve işte package.jsoniçerik:
{
"name": "bagsshoes-server",
"version": "1.0.0",
"description": "",
"main": "src/server.js",
"scripts": {
"start": "node .",
"tsc": "tsc",
"dev": "ts-node-dev --respawn --transpile-only ./src/server.ts",
"prod": "tsc && node ./www/server.js",
"clean": "rd /s /q www/>nul 2>&1|echo.>nul",
"build": "npm run clean && tsc && cp -rf src/config www/config && cp .npmrc www/.npmrc && cp package.json www/package.json && cd www && zip -r Archive.zip . && cd ..",
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "Fahima Mokhtari",
"license": "ISC",
"dependencies": {
"@types/bcrypt": "^3.0.0",
"@types/jsonwebtoken": "^8.3.2",
"bcrypt": "^3.0.6",
"body-parser": "^1.19.0",
"email-validator": "^2.0.4",
"express": "^4.17.1",
"jsonwebtoken": "^8.5.1",
"pg": "^7.9.0",
"reflect-metadata": "^0.1.13",
"sequelize": "^5.3.5",
"sequelize-typescript": "^0.6.9"
},
"devDependencies": {
"@types/bluebird": "^3.5.27",
"@types/express": "^4.17.0",
"@types/node": "^11.13.17",
"@types/sequelize": "^4.27.44",
"@types/validator": "^10.11.1",
"chai": "^4.2.0",
"chai-http": "^4.3.0",
"mocha": "^6.1.4",
"ts-node-dev": "^1.0.0-pre.40",
"tslint": "^5.18.0",
"typescript": "^3.5.3"
}
}
Denedim tryve catchancak beni hiçbir hata, hatta daha karıştı gösterdi. Herhangi bir yardım çok takdir edilecektir!
Not:
Windows ve Düğüm V14.7.0 kullanıyorum
Yanıtlar
FARKINA VARMAK
TLDS! (ÇOK UZUN KAYMA)! Cevap uzun ve zengin! Göz atabilirsin! İyi biçimlendirilmiş!
Aceleniz varsa ! Kontrol edebilirsiniz kimlik doğrulaması bölümü, Sequelize-typescript (değil sequelize) bölümü, Sequelize-daktilo yazısı bölüm.
Ve daha doğrudan gidebilirsiniz için CEHENNEM bölümünde! Nodejs tanıyın V14 CEHENNEM ! (Doğrudan sona gidin! Biraz yukarıda).
Çok kontrol edin DÜZELTME (Postgres v14 HELL)
Başladım ve bilmeden önce kendimi çok fazla yazdım!
SÜPER KILAVUZ
Temelde devam ettirmek sadece takılmamalı! Ama bir hata yapın!
Kod kaynağına bakmak
Buradakisync koda bakarak
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;
}
Asılı olasılıkları kolayca görebilirsiniz!
Kerestecilik
Bu tür anormalliklerde hata ayıklamak için öncelikle iyi bir günlüğe sahip olmak önemlidir !
Ve buradan günlük kaydı nasıl ekleyeceğinizi kontrol edebilirsiniz! Normalde sekelize olsa bile, sorgunun günlük kaydı varsayılan olarak etkinleştirilir!
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
});
Kimlik doğrulamayı kontrol edin
Günlüğe kaydetme olmazsa! Bu, devam etmenin hiçbir şey yapmadığı ve sadece başlangıçta asılı olduğu anlamına gelebilir! Kimlik doğrulamayı ve bağlantının çalışıp çalışmadığını test etmek için!
Authenticate ile test edebilirsiniz :
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);
}
Günlüğe kaydetmezsen! Ve Gonna authenticatesadece tamam yazdırıldı! Ardından süreç kimlik doğrulamaya bağlı . Bu da kimlik doğrulamada bir sorun olduğunu gösteriyor!
Kimlik bilgilerinizi kontrol edin
Herhangi bir hata yapmadığınızdan emin olun!
Psql veya başka bir harici istemciden bağlantıyı kontrol edin
- Eğer işe yaramazsa! Postgres sunucusuyla ilgili bir sorun olduğunu gösteriyor! Veya biraz yapılandırma!
- İşe yararsa! O zaman sorun nodejs'de! Ve programınız!
POSTGRES SÜRÜCÜSÜNÜ (veya db sürücünüzü) YÜKLEMEYİ UNUTMAYIN
Belgeye göre: https://sequelize.org/master/manual/getting-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
Komutlardan biri! Bunu unutmadığınızdan emin olun!
Neler olduğunu anlamak ve hata ayıklamayı daha iyi yapmak! (kod kaynağı günlük kaydı)
Hata ayıklamanın en iyi yolu! Ve sorunun nerede olduğunu gerçekten belirleyin! Kaynak kodun kendisine günlükler eklemektir ! Bir hızlı yolu benim için etmektir doğrudan bununode_modules . Devam repo üzerinde git açtım! Bir arama yaptık! Yerini kararlı sync, authenticate, query! Hepsi ikamet ediyor sequelize.js! Eğer kontrol edebilirsiniz burada ! Yöntemlere ulaşmak için CTRL + F olabilir > authenticate([ekleyin (]. Herhangi bir şekilde! Aynısını içinde de yapabilirsiniz node_modules! Ve günlükleri eklemeye başlayın! Sorunun hangi kısımda olduğunu bileceksiniz! Bu, sorunu gidermenize yardımcı olur!
Diğer yol çatal atmaktır ! Ve çatalınızı kullanın! Ve sadece daha iyi çalışın!
Ama mmm! node_modules hızlı bir yoldur ! Sen edebilir bir kopyasını almak ! çok! Günlüklerinizi kaybetmediğinizden emin olmak için! Bir kez güncellediğinizde! Sonunda tüm modülü çıkararak temizleyin ! Ve yeniden kurun! Ya da sadece günlük oluşturmayı tersine çevirin (geri alın)! Bunu hata ayıklamak için ilginç bir yol buluyorum!
Ama bir hata yapmalı
Normalde olmalı! Kod kaynağını görerek daha iyi öğrenebilirsiniz! Normalde bir hata atılmalıdır! Ama bir süreç asılırsa! Ve hiçbir hata atılmaz! O zaman böyle bir sonuç bekleyebilirsiniz! İşte bu eksik sürücü olabilir! Ayrıca emin olun console.log. İyi çalışıyor! Ve son şey! MMM nodejskendi başına bir sorun olabilir (son bölüme bakın).
Sequelize-typcript kullanıyorum (sequelize değil)
Bilmek çok önemli! Sequelize-typcript sadece bir devamı paketleyicidir! Daktilo desteği eklemek için oradaydı! Dekoratörler ve bazı özellikler sağlar! Ayrıca devamı v5'ten! Typescript doğrudan devam halinde desteklenir! Buraya bakınhttps://sequelize.org/master/manual/typescript.htmlson sürümde sequelize-typcript! Ayrıca devam ettirmenin yerel bildirim türlerini de kullanmaya başladı!
Devamlılık-tipleme olarak sarma devam ediyor! Devam belgelerini doğruladığınızdan emin olun!
Şunu da belirtmek gerekirse, bazı insanlar bağırıyor : Dekoratör kullanmayın! mmmm! mmm! Ve başka bir mmmm!https://stackoverflow.com/a/60369189/7668448
Sırala-typcript
Eğer sequelize-typescript emin sürüm yapmak kullanıyorsanız sequelize-typescriptve sequelizebunu maç ! Orada devam V5belgesine göre! Sanırım ben V6de yapmalı! Ve devam v1yazı tipi için!
npm install sequelize@5 sequelize-typescript@1
Ve oradaki dokümana göre ihtiyaç duyulan paketleri de unutmayın!
https://www.npmjs.com/package/sequelize-typescript
(Tüm bu bilgileri dokümanın kendisinde kontrol edebilir ve doğrulayabilirsiniz)
Neden sequelize-typcript kullanılmalı?
Daha önce de belirtildiği gibi! Sequelize, 'den itibaren typcript için yerel desteğe sahiptir V5. Gereğince burada . Öyleyse neden üzerinde bir sarıcı kullanmalısınız? Bu da dekoratörleri kullanıyor! (Dekoratörlere karşı değilim! Bazıları! Buraya göre )
Kendinize neden sorun? Yazı tipini devam ettirecek bir şey var mı? Yerel yöntemle karşılaştırıldığında önemli bir artı mı? Net şeyler varsa! Lütfen yorumlarda bunlardan bahsedin! Ve güncelleyeceğim! Bu bölüm!
Ve değilse! Yerli çok daha iyi olabilir! Bir bağımlılık veya daha azı çok!
Proje konfigürasyonu
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/**/*"
]
}
Bunlar eklenecek iki önemli şey.
"experimentalDecorators": true,
"esModuleInterop": true
Ama bu senin sorunun olmamalı! Aksi takdirde proje derleme hataları atacaktır!
Cehennem
Düğüm js VERSİYONU (V14 HELL)
Ve evet! Nedeni bu olabilir! Daha önce zaten çalışmış olabilirsiniz! Ve sonra yeni bir bilgisayar veya ortamda! Artık çalışmıyor !
Düğüm sürümü sorun olabilir ! Düğüm v15 ve Düğüm V14 ! Bu bilinen bir problem! Kendim ile bir kez karşılaştım knex.jsve postgres (knex.js bir sorgu oluşturucusudur)! Böylece bunun alakalı olduğunu görebilirsiniz! Hikayemde, kod dizüstü bilgisayarımda ve yerleştirdiğimiz eski vps'de çalışıyordu! Ama sonra bir windows rdp'ye konuşlandırdım! Ve mmm! Boom! Sonra bir süre saçımı çektim! Düşündüm ve kontrol ettim! Değişiklik olmadı! Ve sonra hey geldim! Sadece nodej'leri güncelledim! Ve sonra diğer insanların da aynı şeyle karşılaştığını buldum! Kısacası! Her şey başladı nodejs v14(buna v14 HELL diyorum )! Bu konuda benim cevap kontrol edebilirsiniz burada
Ve görünüşe göre aynı sorun hep oradadır nodejs v15!
Bu konuya ilişkin soruda! Bunu teyit ettik! Masaüstümde her şey iyi çalıştı! Nodejs v12! Ve arkadaşımın bilgisayarıyla! Olmadı! nodejs v14ve nodejs v15. Sonra onaylamak istedim! Ben yükledim nodejs v15ve kabin! BİNGO! İnfaz beklenmedik bir şekilde durur! Kayıt yok! Hata yok! İçeri v12! Hepsi doğru çalışıyordu! İlk başta hatalarım oldu sonra düzelttim! Ve sunucu çalışıyordu! Ve DB'ye bağlı devam edin!
İşte infazlar
V12 ve v13
V13'ü görüntülüyorum! Aynı şey v12 için de geçerlidir!
nvm use v13
Now using node v13.14.0 (npm v6.14.4)
coderhero@HeroStation ~/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 :)
Harika çalışma sorun değil
V14 ve v15 yürütme
v14
coderhero@HeroStation ~/Documents/coderhero/Dev/projects/Fahima-ecommerce LuckyLook node -v
v14.15.0
coderhero@HeroStation ~/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 ::::
coderhero@HeroStation ~/Documents/coderhero/Dev/projects/Fahima-ecommerce LuckyLook
Ve opps! Program, herhangi bir hata çıktısı olmadan beklenmedik bir şekilde çıkıyor!
V15
coderhero@HeroStation ~/Documents/coderhero/Dev/projects/Fahima-ecommerce LuckyLook nvm use v15
Now using node v15.0.1 (npm v7.0.3)
coderhero@HeroStation ~/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 ::::
coderhero@HeroStation ~/Documents/coderhero/Dev/projects/Fahima-ecommerce LuckyLook
Ve yine oppsii! Program, herhangi bir hata çıktısı olmadan beklenmedik bir şekilde çıkıyor!
v14Ve arasında çok fark yoktur v15! Bu V14 HELL.
Kısacası
V14 CEHENNEM bilinen ve çok muhtemel nedenidir! pgSanırım modülle ilgili bir sorun var ! Bir şey değişti v14ve bu soruna neden oldu!
Kısacası! Eğer hiçbir şey mantıklı gelmiyorsa! Ve aynı kodunuz daha önce çalışıyorsa! Yapılacak ilk şey! Nodejs v13veya v12! Bu sizi delilikten kurtarabilir! Nodejs sürümünün ve yenisinin böyle bir sorun yaratacağını kim söyleyebilir?
Bu sorun nedir! Nodejs'de V14 HELL nedir?
Eğer benim gibi detayları bilmek istersen ve ne oldu?
Düğüm V14 ile! API'de bazı önemli değişiklikler oldu! Ayrıca birçok şey değişti! Opensl versiyonu dahil!
Postgres için! Ve pgmodül! Sorun, bu ileti dizisine göre bu yorumda açıklandığı gibiydi :
İlk readyState (özel / belgelenmemiş bir API,
net.Socket, Düğüm 14'te "kapalı" dan "açık" a değişmiş gibi görünüyor.
Mükemmel bir geriye dönük uyumlulukla düzeltmek zor, ancak yeterince yakın bir yamam olduğunu düşünüyorum.
Ve bu PR'ye göre !
Bu farklılıktaki değişiklikleri görebilirsiniz
Kısaca belirtildiği gibi! İçin davranış onReadySatedeğişti net.Socket! Ve uygulanan çözüm hiç kullanılmamaktı onReadyState!
Ve buna göre
Bağlantı artık her zaman bağlantı çağrıldığında kendi akışında bağlan çağrısı yapar.
Bu satırı kontrol edin
Eski sürümde, bağlantı yalnızca soket durumundaysa çağrılırdı closed! readyStatekullanım ortadan kalkar!
Anlayabilirsin! Uygulamaya bağlı olarak! Bu temel değişikliklerden birçok şey etkilenebilir veya etkilenmeyebilir!
İlgili düğüm değişiklikleri
Ve değişimin nerede olduğunu görmek istediğim için! İşte gidiyorsun ve kontrol edebilirsin
https://github.com/nodejs/node/pull/32272
Değişikliklerin günlüğü de kontrol edilebilir:
https://github.com/nodejs/node/blob/master/doc/changelogs/CHANGELOG_V14.md
DÜZELTME (Postgres v14 HELL)
Cevabım gereğince burada .
pgSürücüyü yükselt >=8.0.3! En son sürüme kolayca yükseltebilirsiniz!
npm install pg@latest --save
Ve söz konusu sorunumuzu kontrol edebilirsiniz.
Adresindeki eski sürüm v7
Güncelleniyor v8
İle tekrar koşmak node v15
Taraaaaa! Ve harika çalıştı!
Ve kullanmıyorsanız postgres! Ve sorun şuydu v14 HELL! Test ettiğiniz anlamına gelir v13. Ve işe yaradı! Ardından db sürücünüzü en son sürüme yükseltmeyi deneyin!
Neden düğüm v14 + çıkış ve günlük kaydı hatası yok?
Ayrıca son değişikliklerden bahsetmek için! Yapılan pgişlemin çıkışında yapılır connect() call. Ve onu çıkış yapan da bu! Ve kayıt görülüyordu! Bunun için daha ayrıntılı olarak! İşte nasıl oldu! Sequelize postgres lehçe uygulamasına sahip! Hangi kullanım pg! Ve pg istemcisi! bir bağlantı oluşturun! Bağlantının bir connectolayı var! Bağlandığında onu yayar! Ve düğüm v14 davranışı açıktan başlayarak değiştirdiği için! Akış bağlantısı atlandı! Ve akış bağlantılı olarak alınır! Nerede değil! Ve connectolay doğrudan yayınlanır! Bu olduğunda! İstemci , bağlantı nesnesini requestSsl()ya da startup()yöntemini arayacaktır ! Ve ikisi de arayacak this._stream.write. çünkü akış bağlı değil! Bir hata meydana geldi! Bu hata yakalanmaz! Sonra devam sürücüde söz! Çözülmeden kalacak! Ve sonra olay döngüsü boşalır! Nodejs varsayılan davranış olarak sadece çıkın!
Kod satırlarındaki adımları görebilirsiniz:
- Sequelize pg adaptörü, bir bağlantı ve söz oluşturmak için pg istemcisini arayacak
- pg istemci çağrısı bir bağlantı nesnesine bağlan
- pg bağlantı connect()çağrısı ve yay connect! V14 değişikliği nedeniyle akışın bağlantılı olduğunu düşünme
- pg istemci connectolayı yakalandı ve geri arama çalıştırıldı! requestSsl()ya startup()da koşacak
- Yöntemlerden biri çalıştırılır ve
stream.writeçağrılır ( requestSsl () , startup () ) - Akış Hatası (yakalanmadı)
- Postgres adaptörünün devamı için söz verin! Hala çözülmedi!
- olay döngüsü boş => Nodejs => Çıkış
Nodejs neden çıkar (çözümlenmemiş sözler)
https://github.com/nodejs/node/issues/22088
Düğüm hatasız olarak çıkıyor ve söz beklemiyor (Olay geri araması)
Bir Söz asla çözülmezse ne olur?
NVM
https://github.com/nvm-sh/nvm
Ne nvmolduğunu bilmiyorsan ! Veya kullanmıyorsun nvm. Kullanmayı düşünün! Çok ilginç bir araç olduğu için! Nvm bir düğüm sürümü yönetim aracıdır !
Nvm, nodejs'nin farklı sürümlerinde ve sürümlerinde değişiklik, hata ayıklama ve test etme ile! Hızlı ve bir esinti! Ve böylece nodej'lerin yeni sürümlerini paralel olarak yüklemek!
Sequelize.sync () hakkında not
İçin kullanmayın production! Ya da hiç! (Çoğu ORM! Ve sorgu oluşturucu (knex.js) geçişleri kullanır).
https://sequelize.org/master/manual/model-basics.html#synchronization-in-production
Dokümandan
Yukarıda gösterildiği gibi, senkronizasyon ({force: true}) ve senkronizasyon ({alter: true}) yıkıcı işlemler olabilir. Bu nedenle, üretim seviyesindeki yazılımlar için tavsiye edilmezler. Bunun yerine, Sequelize CLI'nin yardımıyla, gelişmiş Geçişler konseptiyle senkronizasyon yapılmalıdır .