THÔNG BÁO
TLDS! (QUÁ DÀI LÀM BẦU TRỜI)! Câu trả lời là dài và phong phú! Bạn có thể đọc lướt! Nó được hình thành tốt!
Nếu bạn đang vội vàng ! Bạn có thể kiểm tra Xác thực phần Sequelize-typecript (không phải phần tiếp theo) phần Sequelize-typecript phần.
Và tốt hơn hết bạn có thể truy cập trực tiếp đến HELL tiết diện! Tìm hiểu về nodejs v14 HELL ! (Đi thẳng đến phần cuối! Cũng ở trên một chút).
Cũng kiểm tra KHẮC PHỤC (Postgres v14 HELL)
Tôi bắt đầu và trước khi biết, tôi thấy mình đã viết quá nhiều!
HƯỚNG DẪN SIÊU PHẨM
Về cơ bản, phần tiếp theo không nên chỉ bị treo! Nhưng hãy báo lỗi!
Xem xét mã nguồn
Bằng cách xem sync
mã tại đây
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;
}
Người ta có thể dễ dàng nhìn thấy khả năng bị treo!
Ghi nhật ký
Để gỡ lỗi những điểm bất thường như vậy, trước hết, điều quan trọng là bạn phải ghi nhật ký tốt !
Và bạn có thể kiểm tra cách thêm ghi nhật ký tại đây! Mặc dù phần tiếp theo thông thường có ghi nhật ký của truy vấn được kích hoạt theo mặc định!
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
});
Kiểm tra xác thực
Nếu không ghi nhật ký xảy ra! Điều đó có thể có nghĩa là phần tiếp theo không có gì cả và chỉ bị treo ở phần đầu! Để kiểm tra xác thực và xem kết nối có hoạt động không!
Bạn có thể kiểm tra bằng xác thực :
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);
}
Nếu bạn không ghi nhật ký! Và Gonna authenticate
vừa in ok! Sau đó, quá trình bị treo trên xác thực . Điều này gợi ý một vấn đề trong xác thực!
Kiểm tra thông tin đăng nhập của bạn
Đảm bảo rằng bạn không mắc bất kỳ sai lầm nào!
Kiểm tra kết nối từ psql hoặc một số ứng dụng khách bên ngoài khác
- Nếu nó không hoạt động! Nó gợi ý một vấn đề với máy chủ postgres! Hoặc một số cấu hình!
- Nếu nó hoạt động! Sau đó, vấn đề là ở nodejs! Và chương trình của bạn!
ĐỪNG QUÊN CÀI ĐẶT TRÌNH ĐIỀU KHIỂN POSTGRES (Hoặc trình điều khiển db của bạn)
Theo tài liệu: https://sequelize.org/master/manual/ get-started.html #install
# 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
Một trong những lệnh! Hãy chắc chắn rằng bạn không quên điều đó!
Hiểu những gì đang xảy ra và gỡ lỗi tốt hơn! (ghi nhật ký nguồn mã)
Cách tốt nhất để gỡ lỗi! Và thực sự xác định xem vấn đề đang xảy ra ở đâu! Là bằng cách thêm nhật ký vào mã nguồn chính nó! Một cách nhanh chóng đối với tôi là trực tiếp làm điều đó trên node_modules
. Tôi đã mở git trên repo phần tiếp theo! Đã thực hiện một cuộc tìm kiếm! Đã xác định vị trí của sync
, authenticate
, query
! Tất cả đều nằm trong sequelize.js
! bạn có thể kiểm tra tại đây
! Người ta có thể CTRL + F để truy cập các phương thức > authenticate(
[thêm (
]. Dẫu sao thì! Bạn có thể làm tương tự trong node_modules
! Và bắt đầu thêm nhật ký! Bạn sẽ biết vấn đề đang xảy ra ở phần nào! Cách nào giúp bạn gỡ lỗi!
Cách khác là fork ! Và sử dụng nĩa của bạn! Và chỉ hoạt động tốt hơn!
Nhưng mmm! node_modules là một cách nhanh chóng ! Bạn có thể sao chép ! cũng vậy! Để đảm bảo rằng bạn không bị mất nhật ký của mình! Sau khi bạn cập nhật! Ở cuối sạch bằng cách loại bỏ toàn bộ mô-đun! Và cài đặt lại! Hoặc chỉ cần đảo ngược việc tạo nhật ký (hoàn tác)! Tôi thấy đây là một cách thú vị để gỡ lỗi!
Nhưng nó sẽ xuất hiện một lỗi
Bình thường thì nên! Bằng cách xem mã nguồn, bạn có thể biết rõ hơn! Thông thường một lỗi sẽ được ném ra! Nhưng nếu một quá trình bị treo! Và không có lỗi nào được ném ra! Sau đó, bạn có thể mong đợi một kết quả như thế này! Đây có thể là trình điều khiển bị mất tích! Đồng thời đảm bảo rằng console.log
. Đang hoạt động ổn! Và điều cuối cùng! MMM có thể là sự cố với nodejs
chính nó (xem phần cuối cùng).
Tôi đang sử dụng phần tiếp theo-typecript (không phải phần tiếp theo)
Rất quan trọng cần biết! Sequelize-stylescript chỉ là một trình bao bọc phần tiếp theo! Đó là ở đó để thêm hỗ trợ sắp chữ! Nó cung cấp trình trang trí và một số tính năng! Cũng từ phần tiếp theo v5! Typecript được hỗ trợ trực tiếp trong phần tiếp theo! Xem tại đây https://sequelize.org/master/manual/typescript.html phần tiếp theo kiểu chữ trong phiên bản mới nhất! Đã chuyển sang sử dụng quá nhiều kiểu khai báo gốc của phần tiếp theo!
Như phần tiếp theo bọc phần tiếp theo kiểu typecript! Đảm bảo xác minh tài liệu tiếp theo!
Cũng cần lưu ý rằng có một số người la hét :Không sử dụng trang trí! mmmm! ừm! Và một mmmm khác! https://stackoverflow.com/a/60369189/7668448
Sequelize-stylescript
Nếu bạn đang sử dụng phần tiếp theo kiểu-typecript, hãy đảm bảo rằng phiên bản của sequelize-typescript
và sequelize
làm đối sánh ! Theo đó, doc V5
của phần tiếp theo! Tôi đoán là V6
quá nên làm! Và v1
cho phần tiếp theo-typecript!
npm install [email protected] [email protected]
Và đừng quên các gói cần thiết có định dạng theo doc!
https:/ /www.npmjs.com/package/sequelize-typescript
(Bạn có thể kiểm tra và xác minh tất cả những thông tin đó trong chính tài liệu)
Tại sao sử dụng phần tiếp theo kiểu chữ?
Như đã đề cập! Sequelize có hỗ trợ gốc cho bảng chữ bắt đầu từ V5
. Theo tại đây
. Vậy tại sao lại sử dụng một trình bao bọc bên trên nó! Điều đó sử dụng trang trí quá! (Tôi không phản đối những người trang trí! Một số thì như vậy! Theo đây
)
Hãy tự hỏi tại sao? Có bất cứ điều gì để đánh dấu phần tiếp theo! Một điểm cộng quan trọng so với cách bản địa? Nếu có những điều rõ ràng! Hãy đề cập đến chúng trong các bình luận! Và tôi sẽ cập nhật! Phần này!
Và nếu không! Bản địa có thể tốt hơn! Một sự phụ thuộc hoặc ít hơn nhiều!
Cấu hình dự án
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/**/*"
]
}
Đó là hai điều quan trọng cần thêm.
"experimentalDecorators": true,
"esModuleInterop": true
Nhưng đó không phải là vấn đề của bạn! Nếu không, dự án sẽ gặp lỗi biên dịch!
ĐỊA NGỤC
PHIÊN BẢN Node js (V14 HELL)
Và vâng! Đó có thể là nguyên nhân! Bạn có thể đã sử dụng để nó hoạt động bình thường trước đây! Và sau đó trong một máy tính hoặc môi trường mới! Nó không hoạt động nữa !
Phiên bản nút có thể là vấn đề ! Nút v15 và Node v14 ! Đó là một vấn đề đã biết! Bản thân tôi đã gặp phải một lần với knex.js
và postgres
(knox.js là một trình tạo truy vấn)! Vì vậy, bạn có thể thấy rằng có liên quan! Trong câu chuyện của tôi, mã đã hoạt động bình thường trên máy tính xách tay và vps cũ mà chúng tôi đã triển khai! Nhưng sau đó tôi đã triển khai trên windows rdp! Và mmm! Bùm! Sau đó, tôi kéo tóc của tôi một thời gian! Tôi đã phản ánh và kiểm tra! Không có gì thay đổi! Và sau đó tôi đã đến này! Tôi chỉ cập nhật nodejs! Và sau đó tôi thấy rằng những người khác cũng gặp phải điều tương tự! Nói ngắn gọn! Tất cả bắt đầu trên nodejs v14
(tôi gọi đây là v14 ĐỊA NGỤC )! Bạn có thể kiểm tra câu trả lời của tôi về nó tại đây
Và dường như vấn đề tương tự luôn ở đó với nodejs v15
!
Trong câu hỏi của chủ đề này! Chúng tôi đã xác nhận điều đó! Trong máy tính để bàn của tôi tất cả đều hoạt động tốt! Nodejs v12
! Và với máy tính của bạn tôi! Nó đã không! nodejs v14
và nodejs v15
. Sau đó, tôi muốn xác nhận! Tôi đã cài đặt nodejs v15
Và caboom! CHƠI LÔ TÔ! Cuộc hành quyết chỉ dừng lại một cách bất ngờ! Không ghi nhật ký! Không có lỗi! Trong v12
! Tất cả đều hoạt động chính xác! Tôi đã có lỗi lúc đầu sau đó tôi đã sửa chúng! Và máy chủ đã hoạt động! Và tiếp theo được kết nối với DB!
Đây là quá trình thực thi
V12 và v13
Tôi đang hiển thị v13! Điều tương tự cũng xảy ra với 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 :)
Làm việc mát mẻ không có vấn đề gì
Thực thi V14 và 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
Và các opps! Chương trình đang thoát đột ngột mà không có đầu ra lỗi!
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
Và oppsii nữa! Chương trình đang thoát đột ngột mà không có đầu ra lỗi!
Không có sự khác biệt quá giữa v14
và v15
! Đó là V14 HELL
.
Tóm lại
ĐỊA NGỤC V14 là một nguyên nhân đã biết và rất có thể xảy ra! Có sự cố với pg
mô-đun tôi đoán! Có gì đó đã thay đổi trên v14
và gây ra sự cố này!
Trong ngắn hạn! Nếu không có gì là có ý nghĩa! Và nếu mã tương tự của bạn đã hoạt động trước đây! Điều đầu tiên cần làm! Là để kiểm tra với nodejs v13
hoặc v12
! Điều đó có thể cứu bạn khỏi sự điên rồ! Ai có thể nói rằng phiên bản nodejs và một phiên bản mới sẽ tạo ra vấn đề như vậy!
Đây là vấn đề gì! V14 HELL trong nodejs là gì?
Nếu giống tôi, bạn muốn biết chi tiết và điều gì đã xảy ra !?
Với nút V14! Một số thay đổi đột phá đã xảy ra trên api! Ngoài ra nhiều thứ đã được thay đổi! Bao gồm cả phiên bản Openssl!
Đối với bưu điện! Và pg
mô-đun! Sự cố được mô tả trong nhận xét
này theo chuỗi
này :
Và theo điều này PR !
Bạn có thể thấy các thay đổi trong sự khác biệt này
Tóm lại như đã đề cập! Hành vi cho onReadySate
đã thay đổi cho net.Socket
! Và giải pháp được triển khai là không sử dụng onReadyState
ở tất cả!
Và theo điều này
Kiểm tra dòng này
Trong phiên bản cũ hơn, kết nối chỉ được gọi khi ổ cắm đang ở trạng thái closed
tiểu bang! readyState
việc sử dụng bị loại bỏ!
Bạn có thể hiểu! Tùy thuộc vào việc thực hiện! Nhiều thứ có thể bị ảnh hưởng hoặc không bởi những thay đổi cốt lõi đó!
Các thay đổi nút có liên quan
Và bởi vì tôi muốn xem nơi thay đổi xảy ra! Đây là trang của bạn và có thể kiểm tra
https://github.com/nodejs/node/pull/32272
Người ta cũng có thể kiểm tra nhật ký thay đổi:
https://github.com/nodejs/node/blob /master/doc/changelogs/CHANGELOG_V14.md
SỬA (Postgres v14 HELL)
Theo câu trả lời của tôi tại đây .
Nâng cấp pg
trình điều khiển đến >=8.0.3
! Bạn chỉ cần nâng cấp lên phiên bản mới nhất!
npm install [email protected] --save
Và bạn có thể kiểm tra vấn đề của chúng tôi đang được đề cập
Phiên bản cũ tại v7
Đang cập nhật lên v8
Chạy lại với node v15
Taraaaaa! Và nó hoạt động thật tuyệt vời!
Và nếu bạn không sử dụng postgres
! Và vấn đề là v14 HELL
! Có nghĩa là Bạn đã thử nghiệm với v13
. Va no đa hoạt động! Sau đó, hãy cố gắng nâng cấp trình điều khiển db của bạn lên phiên bản mới nhất!
Tại sao nút v14 + thoát và không có lỗi ghi nhật ký
Cũng phải đề cập đến những thay đổi đột phá! Tạo pg
thực hiện quá trình thoát tại cuộc gọi connect() call
. Và đó là những gì đã làm cho nó thoát ra! Và việc ghi nhật ký đã được xem! Chi tiết hơn cho điều này! Đây như thế nào nó đã xảy ra! Sequelize có triển khai phương ngữ postgres! Mà sử dụng pg! Và khách hàng pg! tạo kết nối! Kết nối có connect
Sự kiện! Khi nó kết nối nó phát ra nó! Và bởi vì nút v14 thay đổi hành vi thành bắt đầu bằng mở! Kết nối luồng bị bỏ qua! Và luồng được coi là được kết nối! Nó không ở đâu! Và connect
sự kiện được phát ra trực tiếp! Khi điều đó xảy ra! Máy khách sẽ gọi requestSsl()
hoặc startup()
phương thức của đối tượng kết nối! Và cả hai sẽ gọi this._stream.write
. bởi vì luồng không được kết nối! Xảy ra lỗi! Lỗi này không bắt được! Sau đó, lời hứa trong trình điều khiển tiếp theo! Sẽ ở lại không được giải quyết! Và sau đó vòng lặp sự kiện trở nên trống rỗng! Nodejs theo hành vi mặc định chỉ cần thoát!
Bạn có thể xem từng bước qua các dòng mã:
- adapter sẽ gọi máy khách pg để tạo kết nối và lời hứa
- cuộc gọi ứng dụng pg kết nối trên một đối tượng kết nối
- kết nối pg
connect() call
gọi và phát raconnect
! Nghĩ rằng luồng được kết nối do thay đổi V14 - pg client
connect
sự kiện đã bắt và chạy gọi lại!requestSsl()
hoặcstartup()
sẽ được chạy - Một trong các phương thức get run and
stream.write
sẽ được gọi ( requestSsl , startup () ) - Lỗi luồng (không được khắc phục)
- Promise > trong bộ điều hợp postgres tiếp theo! Vẫn chưa được giải quyết!
- vòng lặp sự kiện trống => Nodejs => Thoát
Tại sao nodejs thoát (lời hứa chưa được giải quyết)
https://github.com/nodejs/node/issues/22088
Nút thoát mà không có lỗi và không chờ đợi lời hứa (Sự kiện gọi lại)
điều gì sẽ xảy ra khi Lời hứa không bao giờ được giải quyết?
NVM
Nếu bạn không biết nvm
gì Là! Hoặc bạn không sử dụng nvm
. Hãy cân nhắc khi sử dụng nó! Vì nó là một công cụ rất thú vị! Nvm là công cụ quản lý phiên bản nút !
Với việc thay đổi nvm, gỡ lỗi và thử nghiệm và với các phiên bản nodejs khác nhau! Thật nhanh chóng và dễ dàng! Và do đó, cài đặt các phiên bản nodejs mới song song!
Lưu ý về sequize.sync ()
Không sử dụng nó cho production
! Hoặc ở tất cả! (Hầu hết ORM! Và trình tạo truy vấn (knox.js) sử dụng di chuyển).
https://sequelize.org/master/manual/model -basics.html # sync-in-production
Từ tài liệu