注意
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;
}
ぶら下がっている可能性を簡単に見ることができます!
ロギング
このような異常を最初にデバッグするには、適切なログを用意することが重要です。 !
そして、ここでログを追加する方法を確認できます!通常は続編ですが、デフォルトでクエリのログがアクティブになっています!
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
});
認証を確認する
ロギングが発生しない場合!それは、続編が何もせず、最初にぶら下がっているだけであることを意味するかもしれません!認証をテストし、接続が機能しているかどうかをテストするには!
認証でテストできます :
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);
}
ログが表示されない場合!そして認証する
印刷は大丈夫です!その後、プロセスは認証でハングします 。これは認証の問題を示唆しています!
資格情報を確認する
間違いを犯していないことを確認してください!
psqlまたはその他の外部クライアントからの接続を確認します
- うまくいかない場合は! postgresサーバーに問題があることを示唆しています!またはいくつかの設定!
- それが機能する場合!次に、問題はnodejsにあります!そしてあなたのプログラム!
POSTGRESドライバー(またはデータベースドライバー)のインストールを忘れないでください
ドキュメントによると: 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
コマンドの1つ!それを忘れていないことを確認してください!
何が起こっているのかを理解し、デバッグを改善します。 (コードソースログ)
デバッグするための最良の方法!そして、問題が発生している場所を実際に特定してください。 ソースコードにログを追加することによるものです 自体! 迅速な方法 私にとっては、直接 node_modules
でそれを行うことです 。続編リポジトリでgitを開きました!検索しました! sync
の場所を決定しました 、認証
、 query
!すべてsequelize.js
にあります ! こちら
で確認できます。 ! Ctrl + Fキーを押して、メソッド> authenticate(
[(コード>を追加 ]。ともかく!
node_modules
でも同じことができます !そして、ログの追加を開始してください!問題が発生している部分がわかります。これは問題のデバッグに役立ちます!
もう1つの方法は、フォークすることです。 !そして、あなたのフォークを使ってください!そして、うまく機能します!
でもうーん! node_modulesは高速な方法です ! コピーを取ることができます !それも!ログを失わないようにするためです。更新したら!最後にクリーン モジュール全体を削除するだけです!そして再インストールしてください!または、ログの作成を元に戻す(元に戻す)だけです!デバッグには面白い方法だと思います!
ただし、エラーが発生するはずです
通常はそうすべきです!コードソースを見ることで、あなたはよりよく知ることができます!通常、エラーがスローされます!しかし、プロセスがハングした場合!そして、エラーはスローされません!そうすれば、このような結果が期待できます!ここでは、ドライバーが欠落している可能性があります。また、 console.log
を確認してください 。大丈夫です!そして最後に! MMMは、 nodejs
の問題である可能性があります それ自体(最後のセクションを参照)。
sequelize-typescriptを使用しています(sequelizeではありません)
知っておくことが非常に重要です! Sequelize-typescriptは単なる続編ラッパーです!それはtypescriptサポートを追加するためにありました!デコレータといくつかの機能を提供します!また、v5の続編から! Typescriptはsequelizeで直接サポートされています!こちらをご覧ください
続編として-typecriptwrapsequelize!必ず続編のドキュメントを確認してください!
また、叫ぶ人もいます。 :デコレータは使用しないでください。んー!うーん!そしてもう1つmmmm! https://stackoverflow.com/a/60369189/7668448
Sequelize-typescript
sequelize-typescriptを使用している場合は、 sequelize-typescript
のバージョンを確認してください。 およびsequelize
一致を実行します !そこにあるドキュメントV5
続編の! V6
だと思います やるべきです!そしてv1
sequelize-typescript用!
npm install [email protected] [email protected]
そして、そこにあるドキュメントに従って、typescriptに必要なパッケージを忘れないでください!
https:/ /www.npmjs.com/package/sequelize-typescript
(ドキュメント自体でこれらすべての情報を確認および確認できます)
sequelize-typescriptを使用する理由
すでに述べたように! Sequelizeは、 V5
以降のtypescriptをネイティブでサポートしています。 。 こちら
による 。では、なぜその上にラッパーを使用するのですか?デコレータも使用しています! (私はデコレータに反対していません!一部は反対です!ここ
によると )
理由を自問してみてください。続編にするものはありますか-typescript!ネイティブの方法と比較して重要なプラス?明確なことがあれば!コメントでそれらに言及してください!そして更新します!このセクション!
そうでなければ!ネイティブははるかに優れている可能性があります!依存関係またはそれ以下の多く!
プロジェクト構成
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/**/*"
]
}
これらは追加する2つの重要なものです。
"experimentalDecorators": true,
"esModuleInterop": true
しかし、それはあなたの問題ではないはずです!そうしないと、プロジェクトはコンパイルエラーをスローします!
地獄
Node jsバージョン(V14 HELL)
そして、そうです!それが原因かもしれません!あなたはすでにそれを正しく機能させるために使用したかもしれません!そして、新しいコンピューターや環境で! もう機能していません !
ノードのバージョンが問題になる可能性があります ! ノードv15 およびノードv14 !これは既知の問題です。私自身、 knex.js
に一度遭遇しました およびpostgres
(knex.jsはクエリビルダーです)!だからあなたはそれが関連しているのを見ることができます!私の話では、コードは私のラップトップと私たちが展開した古いvpsで問題なく機能していました!しかし、それから私はWindows rdpにデプロイしました!そしてうーん!ブーム!それからしばらく髪を引っ張った!振り返ってチェックしました!変化はありませんでした!そして、私はちょっと来ました! nodejsのみを更新しました!そして後で私は他の人が同じことに遭遇したことに気づきました!要するに!それはすべてnodejsv14
で始まりました (私はこれを v14 HELLと呼んでいます )! こちら
で私の答えを確認できます
そして、明らかに同じ問題が nodejs v15
でも常に存在します !
このスレッドの質問で!確認しました!私のデスクトップではすべてうまくいきました! Nodejs v12
!そして、私の友達のコンピューターで!そうではありませんでした! nodejs v14
およびnodejsv15
。それから確認したかった! 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地獄 既知の非常に可能性の高い原因です! pg
に問題があります モジュールだと思います! v14
で何かが変更されました そしてこの問題を引き起こしました!
要するに!何も意味がない場合!そして、あなたの同じコードが以前に機能していたなら!最初にすること! nodejs v13
で確認することです またはv12
!それはあなたを狂気から救うことができます! nodejsのバージョンと新しいバージョンがそのような問題を引き起こすと誰が言うでしょう!
この問題は何ですか! nodejsのV14HELLとは何ですか?
私のように、あなたは詳細と何が起こったのか知りたいのです!?
ノードV14で! APIでいくつかの重大な変更が発生しました!また、多くのことが変更されました! OpenSSLバージョンを含みます!
postgresのために!そしてpg
モジュール!問題は、このコメント
で説明されているとおりでした。 この
そして、これに従って PR !
要するに 述べたように! onReadySate
の動作 net.Socket
用に変更されました !そして、実装されたソリューションは、 onReadyState
を使用しないことでした。 まったく!
そしてこれに従って
古いバージョンでは、ソケットが close
にある場合にのみ接続が呼び出されていました。 州! readyState
使用がなくなります!
分かります!実装によって異なります!これらのコアの変更によって、多くのことが影響を受ける場合と影響を受けない場合があります!
関連するノードの変更
そして、私は変化がどこで起こるかを見たかったので!さあ、チェックしてみましょう
https://github.com/nodejs/node/pull/32272
変更のログも確認できます:
https://github.com/nodejs/node/blob /master/doc/changelogs/CHANGELOG_V14.md
FIX(Postgres v14 HELL)
私の答えによると、こちら 。
pg
をアップグレードする > =8.0.3
へのドライバー !最新にアップグレードするだけです!
npm install [email protected] --save
そして、あなたは問題の私たちの問題をチェックすることができます
v7
の古いバージョン
v8
に更新しています
node v15
で再実行
タラァァァァァァァァァァァァァァァァァァァァァァァァァァァァァァァァァァァァァァ!そしてそれは素晴らしく機能しました!
また、 postgres
を使用していない場合 !そして問題はv14HELL
でした !意味v13
でテストしました 。そしてそれはうまくいきました!次に、dbドライバーを最新のものにアップグレードしてみてください!
ノードv14+が終了し、ログエラーが発生しない理由
また、重大な変更についても言及します。 pg
を作成しました connect()呼び出し
でプロセスを終了します 。そしてそれがそれを終了させた理由です!そして、ロギングが見られることになっていました!これについてもっと詳しく!ここでそれがどのように起こったのか! Sequelizeにはpostgres方言の実装があります!どちらがpgを使用しますか?そしてpgクライアント!接続を作成してください!接続にはconnect
があります イベント!接続すると放出します!また、ノードv14は、動作をopenから開始するように変更するためです。ストリーム接続はスキップされます!そして、ストリームは接続されていると見なされます!そうでないところ!そしてconnect
イベントは直接発せられます!それが起こったとき!クライアントはrequestSsl()
を呼び出します またはstartup()
接続オブジェクトのメソッド!そして、どちらも this._stream.write
を呼び出します 。ストリームが接続されていないためです!エラーが発生します!このエラーはキャッチされません!その後、ドライバーの続編での約束!未解決のままになります!そして、イベントループは空になります! Nodejsのデフォルトの動作は、終了するだけです!
コード行のステップを確認できます:
- pgアダプターを続編しますpgクライアントを呼び出して接続とpromiseを作成します
- pgクライアント呼び出し接続接続オブジェクト上
- pg接続
connect()
connect
を呼び出して送信します ! V14の変更によりストリームが接続されていると考える - pgクライアント
接続
イベントがキャッチされ、コールバックが実行されます!requestSsl()
またはstartup()
実行されます - メソッドの1つが実行され、
stream.write
呼び出されます( requestSsl() 、 startup()> ) - ストリームエラー(キャッチされません)
- 約束> postgresアダプターの続編で!まだ解決されていません!
- イベントループが空です=>Nodejs=>終了
nodejsが終了する理由(未解決の約束)
https://github.com/nodejs/node/issues/22088
ノードはエラーなしで終了し、約束を待たない(イベントコールバック)
NVM
nvm
がわからない場合 は!または、 nvm
を使用していません 。それを使用することを検討してください!とても面白いツールなので! Nvmはノードバージョン管理ツールです !
nvmを変更し、デバッグし、異なるバージョンのnodejsでテストします!速くて簡単です!そのため、新しいバージョンのnodejsを並行してインストールします!
sequelize.sync()に関する注意
本番
には使用しないでください !またはまったく! (ほとんどのORM!およびクエリビルダー(knex.js)は移行を使用します。)
https://sequelize.org/master/manual/model -basics.html#synchronization-in-production
ドキュメントから