Bluebird NPM: 예제를 통한 Bluebird JS 약속
⚡ 스마트 요약
Bluebird JS는 모든 기능을 갖춘 Promise 라이브러리입니다. Java이 스크립트의 핵심 기능은 프로미스화입니다. 콜백 기반 Node 모듈을 프로미스를 반환하는 모듈로 변환하므로, 다음과 같은 전체 라이브러리를 프로미스화할 수 있습니다. MongoDB 드라이버는 비동기적으로 사용할 수 있습니다.

블루버드JS란?
Bluebird JS는 모든 기능을 갖춘 Promise 라이브러리입니다. Java스크립트의 가장 큰 특징은 다른 Node 모듈을 "프로미스화"하여 비동기적으로 사용할 수 있게 해준다는 점입니다. 프로미스화는 콜백 함수에 적용되는 개념으로, 호출되는 모든 콜백 함수가 값을 반환하도록 보장합니다.
그래서 만약 Node.js를 모듈에는 값을 반환하지 않는 콜백 함수가 포함되어 있는데, 이 모듈을 프로미스화하면 모듈 내의 모든 함수가 자동으로 값을 반환하도록 수정됩니다.
즉, Bluebird를 사용하여 만들 수 있습니다. MongoDB 이 모듈은 비동기적으로 실행되므로 Node.js 애플리케이션을 작성할 때 편의성이 한층 더 높아집니다.
아래 예제는 먼저 "EmployeeDB" 데이터베이스의 "Employee" 컬렉션에 연결합니다. 연결이 설정되면 해당 컬렉션의 모든 레코드를 검색하여 콘솔에 표시합니다.
Bluebird JS 라이브러리로 약속을 생성하는 방법
다음은 Bluebird JS 라이브러리를 사용하여 프로미스를 생성하는 방법을 단계별로 보여주는 예제입니다.
1단계) NPM 모듈 설치
Node 애플리케이션에서 Bluebird를 사용하려면 Bluebird 모듈이 필요합니다. 아래 명령어를 사용하여 설치하세요.
npm install bluebird
2단계) 블루버드 모듈을 포함시키세요
다음 단계는 Bluebird 모듈을 코드에 포함시키고 전체 코드를 프로미스화하는 것입니다. MongoDB 모듈. 여기서 프로미스화란 Bluebird가 해당 모듈에 정의된 모든 메서드가 프로미스화되도록 보장하는 것을 의미합니다. MongoDB 라이브러리는 약속을 반환합니다.
Code 설명 :
- The
require이 명령어에는 Bluebird 라이브러리가 포함되어 있습니다. - 블루버드의
.promisifyAll()이 메서드는 모든 메서드의 비동기 버전을 생성합니다. MongoDB 모듈은 백그라운드에서 실행되고 프로미스를 반환하는 기능을 제공합니다.
3단계) 데이터베이스에 연결합니다
마지막 단계는 데이터베이스에 연결하여 컬렉션의 모든 레코드를 검색하고 콘솔 로그에 표시하는 것입니다.
Code 설명 :
- 공지 사항
connectAsync일반적인 방법 대신 이 방법이 사용됩니다.connect방법. 블루버드는 다음을 추가합니다. 비동기 각 메서드에 붙는 접미사 MongoDB 이 라이브러리는 프로미스를 반환하는 호출과 그렇지 않은 호출을 구분합니다. `Async` 접미사가 없는 메서드는 프로미스를 반환한다는 보장이 없습니다. - 유사하게
connectAsync밸리findAsync이 메서드는 모든 레코드를 반환합니다. MongoDB "직원" 컬렉션. - If
findAsync성공적으로 해결되면 다음 블록은 컬렉션의 각 레코드를 반복하여 콘솔 로그에 표시합니다.
위의 단계를 올바르게 수행하면 아래 출력과 같이 직원 컬렉션에 있는 모든 문서가 콘솔에 표시됩니다.
다음은 참고용으로 전체 코드입니다.
var Promise = require('bluebird'); // promisifyAll adds an Async variant of every MongoDB method var mongoClient = Promise.promisifyAll(require('mongodb')).MongoClient; mongoClient.connectAsync('mongodb://localhost/EmployeeDB') .then(function(db) { return db.collection('Employee').findAsync({}); }) .then(function(cursor) { cursor.each(function(err, doc) { console.log(doc); }); });
⚠️ 드라이버 버전 참고: 위 코드는 대상을 지정합니다. MongoDB 노드 드라이버 2.x, 여기서 connect 데이터베이스 객체로 해결됩니다. 드라이버에서 3.0년부터 그것은 다음과 같이 해결됩니다 MongoClient그러므로 체인은 호출해야 합니다. client.db('EmployeeDB').collection('Employee') 대신 db.collection('Employee')최신 드라이버 버전에서는 이미 네이티브 프로미스를 반환하므로 다음과 같은 이점이 있습니다. promisifyAll 불필요함 MongoDB 구체적으로.
Bluebird와 Native Promise 중 어떤 것을 사용해야 할까요?
Bluebird가 처음 작성되었을 당시 Node는 프로미스를 전혀 지원하지 않았기 때문에 이 라이브러리는 플랫폼의 진정한 공백을 메웠습니다. Node는 버전 4부터 네이티브 프로미스를 제공하기 시작했습니다. async/await 버전 7.6 이후로 계산 방식이 상당히 달라졌는데, 이는 오늘날 프로젝트를 시작하는 사람들에게는 큰 영향을 미칠 수 있습니다.
| 아래 | 블루 버드 | 네이티브 프로미스 |
|---|---|---|
| 의존 | 설치 및 유지 관리를 위한 npm 패키지 | 런타임에 내장됨 |
| 프로미스화 콜백 | promisifyAll() 전체 모듈을 변환합니다 |
util.promisify() 하나의 함수를 변환합니다 |
| 추가 도우미 | 지도, 필터, 속성, 각, 타임아웃, 취소 | 모두, 모두 정착, 어떤 인종만 |
| 긴 스택 traces | 예, 활성화되면 | 개선되었지만 더 짧아졌습니다. |
| 가장 좋은 | 기존 콜백 라이브러리, 동시성 도우미 | 새로운 코드, 그리고 async await를 사용하는 모든 코드 |
새로운 작업에는 네이티브 프로미스를 선택하세요. 네이티브 프로미스는 종속성이 필요 없고 async await와 직접 통합됩니다. 종속성이 여전히 콜백만 제공하거나, 동시성 도우미 함수(예: async await)가 필요한 경우에는 Bluebird를 사용하세요. Promise.map 동시 실행 제한을 설정하면 상당한 양의 코드를 절약할 수 있습니다.
Bluebird Promise를 사용하여 오류를 처리하는 방법
위 예시에는 오류 경로가 없습니다. 만약 MongoDB 실행 중이 아니거나 컬렉션 이름이 잘못된 경우, 체인이 거부되고 아무것도 출력되지 않습니다. 프로세스는 아무런 설명 없이 종료됩니다. 모든 프로미스 체인에는 종료 핸들러가 필요합니다.
블루버드는 지원합니다 .catch() 거절의 경우 및 .finally() 어떤 경우에도 실행되어야 하는 정리 작업에 사용됩니다. 또한 특정 유형의 오류를 처리하면서 다른 유형의 오류는 전파하도록 하는 타입이 지정된 catch도 지원합니다.
var Promise = require('bluebird'); var mongoClient = Promise.promisifyAll(require('mongodb')).MongoClient; var connection; mongoClient.connectAsync('mongodb://localhost/EmployeeDB') .then(function(db) { connection = db; return db.collection('Employee').findAsync({}); }) .then(function(cursor) { return cursor.toArrayAsync(); }) .then(function(docs) { docs.forEach(function(doc) { console.log(doc); }); }) .catch(Promise.TimeoutError, function(err) { console.error('The database did not respond in time.'); }) .catch(function(err) { // Any other rejection from any step above arrives here console.error('Query failed:', err.message); }) .finally(function() { // Runs on success and on failure, so the socket always closes if (connection) { connection.close(); } });
여기서 중요한 세 가지 습관이 있습니다. 첫째, 위치 .catch() 각 단계가 끝난 후가 아니라 마지막에 처리해야 합니다. 왜냐하면 하나의 터미널 핸들러가 체인의 모든 이전 링크에서 발생하는 거부를 모두 수신하기 때문입니다. 둘째, 사용하십시오. .finally() 데이터베이스 연결과 같은 리소스를 해제하는 데 있어 성공 및 실패 경로 모두에서 실행되므로 주의해야 합니다. 세 번째로, 예외 처리 없이 체인을 남겨두지 마십시오. 현재 버전에서는 처리되지 않은 거부가 Node 프로세스를 종료시키며, Bluebird는 그 전에 명시적인 경고를 출력합니다. 긴 스택 활성화 trac개발 중에 Promise.config({ longStackTraces: true }) 거절 사유를 훨씬 쉽게 찾아낼 수 있게 해줍니다.
Bluebird Promisify의 일반적인 오류 및 해결 방법
Bluebird에서 발생하는 대부분의 문제는 라이브러리 자체의 결함보다는, 프로미스화된 명명 규칙이나 콜백과 프로미스 호출 방식을 동일한 함수 체인에서 혼합하여 사용하는 데서 비롯됩니다. 아래 각 증상에는 원인과 해결 방법이 명시되어 있습니다.
- "connectAsync는 함수가 아닙니다": 해당 모듈은 간접적으로 호출하는 대신 직접 호출해야 했습니다.
promisifyAll()따라서 비동기 변형은 존재하지 않습니다. 위와 같이 require 호출을 래핑하세요. - 일반 메서드를 호출했을 때 undefined가 반환됩니다.
connect()여전히 콜백을 기대합니다. Async 접미사가 붙은 버전만 프로미스를 반환합니다. - 비동기 메서드에 콜백 함수 전달하기: 콜백도 제공하지 않습니다.
await그리고 해당 약속은 관찰되지 않고 해결됩니다. 호출당 하나의 스타일만 사용하고, 두 가지 스타일을 동시에 사용하지 마십시오. - 이미 프로미스 기반 라이브러리에서 promisifyAll을 사용하는 경우: 무해하지만 불필요하며, 접미사가 두 개 붙은 혼란스러운 이름이 생성됩니다. 먼저 라이브러리 문서를 확인하세요.
- 오류를 조용히 삭제하기: 체인이 없는
.catch()노드가 처리되지 않은 거부를 보고하고 종료될 때까지 거부 사유를 숨깁니다. 짧은 스크립트라도 항상 예외 처리를 통해 체인을 종료해야 합니다.



