Bluebird NPM: promessa do Bluebird JS com exemplo
โก Resumo Inteligente
Bluebird JS รฉ uma biblioteca de Promises completa para JavaScript cuja principal funcionalidade รฉ a promisificaรงรฃo: converter mรณdulos Node baseados em callbacks em mรณdulos que retornam promessas, de modo que uma biblioteca inteira como a MongoDB O driver pode ser usado de forma assรญncrona.

O que รฉ Bluebird JS?
Bluebird JS รฉ uma biblioteca de Promises completa para JavaScript. Sua principal caracterรญstica รฉ permitir que vocรช "prometa" outros mรณdulos do Node para usรก-los de forma assรญncrona. Promisificar รฉ um conceito aplicado a funรงรตes de retorno de chamada (callbacks), garantindo que toda funรงรฃo de retorno de chamada executada retorne um valor.
Entรฃo, se um Node.js O mรณdulo contรฉm uma funรงรฃo de retorno de chamada que nรฃo retorna um valor, prometendo que o mรณdulo modificarรก automaticamente todas as funรงรตes nele contidas para que cada uma retorne um valor.
Isso significa que vocรช pode usar o Bluebird para fazer o MongoDB O mรณdulo รฉ executado de forma assรญncrona, o que adiciona um nรญvel extra de facilidade ao escrever aplicaรงรตes Node.js.
O exemplo abaixo primeiro estabelece uma conexรฃo com a coleรงรฃo โEmployeeโ no banco de dados โEmployeeDBโ. Uma vez estabelecida a conexรฃo, ele recupera todos os registros da coleรงรฃo e os exibe no console.
Como gerar promessas com a biblioteca Bluebird JS
Aqui estรก um exemplo passo a passo mostrando como gerar promessas com a biblioteca Bluebird JS.
Passo 1) Instalando os mรณdulos NPM
Para usar o Bluebird em uma aplicaรงรฃo Node, o mรณdulo Bluebird รฉ necessรกrio. Instale-o com o comando abaixo:
npm install bluebird
Etapa 2) Inclua o mรณdulo Bluebird
O prรณximo passo รฉ incluir o mรณdulo Bluebird no seu cรณdigo e transformรก-lo em uma promessa. MongoDB mรณdulo. Promissor aqui significa que o Bluebird garante que cada mรฉtodo definido no MongoDB biblioteca retorna uma promessa.
Code Explicaรงรฃo:
- O
requireO comando inclui a biblioteca Bluebird. - Pรกssaro Azul
.promisifyAll()O mรฉtodo cria uma versรฃo assรญncrona de cada mรฉtodo. MongoDB O mรณdulo fornece as informaรงรตes necessรกrias, de forma que cada um seja executado em segundo plano e retorne uma promessa.
Etapa 3) Conecte-se ao banco de dados
A etapa final consiste em conectar-se ao banco de dados, recuperar todos os registros da coleรงรฃo e exibi-los no log do console.
Code Explicaรงรฃo:
- Observe a
connectAsyncO mรฉtodo รฉ usado em vez do normal.connectmรฉtodo. Bluebird acrescenta o Assรญncrono sufixo para cada mรฉtodo no MongoDB Biblioteca para distinguir as chamadas que retornam promessas daquelas que nรฃo retornam. Mรฉtodos sem o sufixo Async nรฃo possuem essa garantia. - Semelhante a
connectAsync,findAsyncO mรฉtodo retorna todos os registros em MongoDB Coleรงรฃo โFuncionรกrioโ. - If
findAsyncSe a operaรงรฃo for resolvida com sucesso, o bloco seguinte itera por cada registro da coleรงรฃo e o exibe no console.
Se os passos acima forem executados corretamente, todos os documentos da coleรงรฃo Funcionรกrio serรฃo exibidos no console, conforme mostrado na saรญda abaixo.
Segue o cรณdigo completo para referรชncia:
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); }); });
โ ๏ธ Observaรงรฃo sobre a versรฃo do driver: O cรณdigo acima tem como alvo MongoDB Driver Node 2.x, onde connect resolve com um objeto de banco de dados. Do driver 3.0 em diante resolve-se com um MongoClient, entรฃo a cadeia deve chamar client.db('EmployeeDB').collection('Employee') em vez de db.collection('Employee')As versรตes modernas dos drivers tambรฉm jรก retornam promessas nativas, o que torna promisifyAll desnecessรกrio para MongoDB especificamente.
Bluebird vs Native Promises: Qual usar?
Quando o Bluebird foi escrito pela primeira vez, o Node nรฃo tinha nenhum suporte a promises, entรฃo a biblioteca preencheu uma lacuna real na plataforma. O Node passou a oferecer promises nativas a partir da versรฃo 4 e async/await Desde a versรฃo 7.6, o cรกlculo muda consideravelmente para quem estรก comeรงando um projeto hoje.
| Aspecto | Bluebird | Promessas Nativas |
|---|---|---|
| Dependรชncia | Um pacote npm para instalar e manter. | Integrado ao ambiente de execuรงรฃo |
| Retornos de chamada promissores | promisifyAll() converte um mรณdulo inteiro |
util.promisify() converte uma funรงรฃo |
| Ajudantes extras | mapa, filtro, propriedades, cada, tempo limite, cancelamento | todos, todosLimpado, qualquer, raรงa apenas |
| Pilha longa traces | Sim, quando ativado | Melhorado, porรฉm mais curto. |
| Melhor para | Bibliotecas de retorno de chamada legadas, auxiliares de concorrรชncia | Novo cรณdigo e tudo que utilize async/await. |
Escolha promises nativas para novos trabalhos, pois elas nรฃo precisam de dependรชncias e se integram diretamente com async/await. Recorra ao Bluebird quando uma dependรชncia ainda expรตe apenas callbacks ou quando seus auxiliares de concorrรชncia, como Promise.map Com um limite de concorrรชncia, รฉ possรญvel economizar uma quantidade significativa de cรณdigo.
Como lidar com erros com Promises do Bluebird
O exemplo acima nรฃo possui um caminho de falha. Se MongoDB Se a cadeia de promessas nรฃo estiver em execuรงรฃo ou o nome da coleรงรฃo estiver incorreto, ela serรก rejeitada e nada serรก impresso โ o processo simplesmente serรก encerrado sem nenhuma explicaรงรฃo. Toda cadeia de promessas precisa de um manipulador de tรฉrmino.
Suporte Bluebird .catch() para rejeiรงรตes e .finally() para limpeza que deve ser executada de qualquer maneira. Tambรฉm oferece suporte a blocos catch tipados, que lidam com uma classe de erro enquanto permitem que outras se propaguem.
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(); } });
Trรชs hรกbitos sรฃo importantes aqui. Primeiro, o lugar .catch() no final, em vez de apรณs cada etapa, porque um manipulador de terminal recebe rejeiรงรตes de todos os elos precedentes na cadeia. Em segundo lugar, use .finally() para liberar recursos como uma conexรฃo de banco de dados, jรก que รฉ executado tanto no caminho de sucesso quanto no de falha. Terceiro, nunca deixe uma cadeia sem uma condiรงรฃo: uma rejeiรงรฃo nรฃo tratada encerra o processo do Node nas versรตes atuais, e o Bluebird exibirรก um aviso explรญcito sobre isso antecipadamente. Habilitando pilha longa traces durante o desenvolvimento com Promise.config({ longStackTraces: true }) Isso facilita muito a localizaรงรฃo da origem de uma rejeiรงรฃo.
Erros comuns do Bluebird Promisify e suas soluรงรตes
A maioria dos problemas do Bluebird decorre da convenรงรฃo de nomenclatura baseada em promessas ou da mistura de estilos de chamada de callback e promessa na mesma cadeia, e nรฃo de qualquer falha na biblioteca em si. Cada sintoma abaixo indica sua causa e sua soluรงรฃo.
- โconnectAsync nรฃo รฉ uma funรงรฃoโ: O mรณdulo foi exigido diretamente em vez de por meio de
promisifyAll()Portanto, nรฃo existem variantes assรญncronas. Envolva a chamada require conforme mostrado acima. - Chamando o mรฉtodo simples e obtendo undefined:
connect()Ainda espera um retorno de chamada. Somente a cรณpia com o sufixo Async retorna uma promessa. - Passando uma funรงรฃo de retorno de chamada para um mรฉtodo assรญncrono: nรฃo fornecer nem um retorno de chamada nem
awaite a promessa se resolve sem ser observada. Use um estilo por chamada, nรฃo ambos. - promisifyAll em uma biblioteca jรก baseada em promessas: Inofensivo, porรฉm inรบtil, e gera nomes confusos com sufixos duplos. Consulte a documentaรงรฃo da biblioteca primeiro.
- Perder erros silenciosamente: uma corrente sem
.catch()Oculta o motivo da rejeiรงรฃo atรฉ que o Node reporte uma rejeiรงรฃo nรฃo tratada e encerre a execuรงรฃo. Sempre finalize a cadeia com um bloco `catch`, mesmo em scripts curtos.



