2014-07-17 15 views
7

Sto usando NodeJS con Express e usando Bluebird per promesse. Sto cercando di promettere l'oggetto app come di seguito ma una volta le funzioni promesse generano sempre errori. Parte del codice è qui sotto:Come promettere NodeJS Express con Bluebird

var express = require('express'), 
    app = express(), 
    bodyParser = require('body-parser'), 
    Promise = require("bluebird"); 

    app.postAsync = Promise.promisify(app.post); 

    app.postAsync('/api/v1/users/update').then(function(req, res, next) { 
    // never gets here 
    }) 
     .catch(function(err) { 
      console.log("doh!!!"); 
     }); 

Ho provato a promettere tutto con lo stesso effetto. Perché sta fallendo e c'è un modo per promettere post/get?

+1

Che errore c'è? – Bergi

+3

Capisci che cosa deve fare il callback che passi a ['app.post'] (http://expressjs.com/api.html#app.VERB), quando verrà chiamato, e con quali argomenti ? Non puoi usare Promises qui! – Bergi

+0

@Bergi hai ragione, sono un idiota. Ops. Questo è solo routing serveride, non so nemmeno perché ho pensato che stava cercando di avviare una richiesta qui. – Etai

risposta

18

Davvero non vuoi farlo. Una promessa è la errata astrazione per questo.

Una promessa rappresenta l'esito di un'operazione finale. Una promessa può cambiare solo il suo stato una volta quindi, anche se riesci a promettere lo app.post correttamente, sarà in grado di servire un solo cliente, una volta.

Le promesse sono un'astrazione fantastica - ma questo non è sicuramente un problema che promette di risolvere. Invece, se sei interessato a interessanti astrazioni con le promesse puoi controllare l'Q-IO di Qr-kriskowal (Q autore) o uno dei router promettenti in cui restituisci le promesse, ma il gestore stesso viene chiamato più volte.

Non posso enfatizzare abbastanza: le promesse sono un'astrazione terrificante ma non risolvono o tentano di risolvere tutti i problemi di concorrenza.