PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Kết nối với postgres từ các bản ghi bị treo

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.

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 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-typescriptsequelize 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 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.jspostgres (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 v14nodejs 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 v14v15 ! Đó 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ã:

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

https://github.com/nvm-sh/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




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Chuyển đổi / Chuyển lại trong Slony-I trong khi nâng cấp các phiên bản chính của PostgreSQL 8.4.x / 9.3.x

  2. lỗi node-postgres $ 1 IS NULL

  3. postgresql 9.5:cố gắng chia một chuỗi thành hai trường dựa trên dấu cách

  4. Chuyển đổi múi giờ UTC trong postgresql thành EST (giờ địa phương)

  5. Liên tục chèn tất cả các kết hợp duy nhất gặp phải của ba ID