web-dev-qa-db-fra.com

Bluebird warning "Une promesse a été créée dans un gestionnaire mais n'a pas été retournée"

J'obtiens l'avertissement de ne pas retourner une promesse créée de Bluebird et je ne comprends pas pourquoi et comment je dois réécrire mon code.

(J'ai essayé de lire l'avertissement sur Bluebird API page et page anti-pattern car je soupçonne que c'est ce que je fais)

Dans mon fichier view.js:

var express = require('express'),
    router = express.Router(),
    settings = myReq('config/settings'),
    Sets = myReq('lib/Sets'),
    log = myReq('lib/utils').getLogger('View');

router.get('/:setId/', function(req, res, next) {
    var
        setId = req.params.setId,  
        user = req.user,
        set = new Sets(setId, user);

    log.info('Got a request for set: ' + setId);

    // The below line gives the warning mentioned
    set.getSet().then(function(output) {
        res.send(output);

    }).error(function(e){
        log.error(e.message, e.data);
        res.send('An error occurred while handling set:' + e.message);
    });

});

module.exports = router;

Dans mon fichier Sets.js, j'ai:

var
    Promise = require('bluebird'),
    OE = Promise.OperationalError,
    settings = myReq('config/settings'),
    UserData = myReq('lib/userData'),
    log = myReq('lib/utils').getLogger('sets'),
    errorToSend = false;

module.exports = function(setId, user) {
    var 
        sets = myReq('lib/utils').getDb('sets');

    return {

        getSet : function() {

            log.debug('Getting set')

            return sets.findOneAsync({
                setId:setId
            }).then(function(set){
                if ( set ) {
                    log.debug('got set from DB');
                } else {
                    set = getStaticSet(setId);
                    if ( ! set ) {
                        throw new OE('Failed getting db records or static template for set: ' + setId );
                    }
                    log.debug('got static set');
                }

                log.debug('I am handling set')

                if ( ! checkSet(set) ) {
                    var e = new OE('Failed checking set');
                    e.data = set;
                    throw e;
                }

                return {
                    view : getView(set),
                    logic : set.logic,
                    canEdit : true,
                    error : errorToSend
                };

            });
        }
    };
};

Ainsi, la ligne dans mon fichier view.js avec "set.getSet ()" donne l'avertissement de ne pas retourner la promesse créée. Il semble que ce script fasse toujours ce que j'attends, mais je ne comprends pas pourquoi je reçois l'avertissement.

Trace de la pile:

Warning: a promise was created in a handler but was not returned from it
    at Object.getSet (C:\dev\infoscrn\lib\Sets.js:36:25)
    at C:\dev\infoscrn\routes\view.js:39:20
    at Layer.handle [as handle_request] (C:\dev\infoscrn\node_modules\express\lib\router\layer.js:82:5)
    at next (C:\dev\infoscrn\node_modules\express\lib\router\route.js:110:13)
    at Route.dispatch (C:\dev\infoscrn\node_modules\express\lib\router\route.js:91:3)
    at Layer.handle [as handle_request] (C:\dev\infoscrn\node_modules\express\lib\router\layer.js:82:5)
    at C:\dev\infoscrn\node_modules\express\lib\router\index.js:267:22
    at param (C:\dev\infoscrn\node_modules\express\lib\router\index.js:340:14)
    at param (C:\dev\infoscrn\node_modules\express\lib\router\index.js:356:14)
    at Function.proto.process_params (C:\dev\infoscrn\node_modules\express\lib\router\index.js:400:3)
    at next (C:\dev\infoscrn\node_modules\express\lib\router\index.js:261:10)
    at Function.proto.handle (C:\dev\infoscrn\node_modules\express\lib\router\index.js:166:3)
    at router (C:\dev\infoscrn\node_modules\express\lib\router\index.js:35:12)
    at Layer.handle [as handle_request] (C:\dev\infoscrn\node_modules\express\lib\router\layer.js:82:5)
    at trim_prefix (C:\dev\infoscrn\node_modules\express\lib\router\index.js:302:13)
    at C:\dev\infoscrn\node_modules\express\lib\router\index.js:270:7
    at Function.proto.process_params (C:\dev\infoscrn\node_modules\express\lib\router\index.js:321:12)
    at next (C:\dev\infoscrn\node_modules\express\lib\router\index.js:261:10)
    at C:\dev\infoscrn\node_modules\express\lib\router\index.js:603:15
    at next (C:\dev\infoscrn\node_modules\express\lib\router\index.js:246:14)
19
Karl Erik Steinbakk

Tout d'abord, essayez de mettez à jour toutes vos dépendances . Il y a eu une version récente de Bluebird, qui corrigeait n problème impliquant cet avertissement .

Ensuite, assurez-vous que retour de tous vos gestionnaires .

Ensuite, si vous obtenez toujours l'avertissement (comme moi), vous pouvez désactiver cet avertissement spécifique . J'ai choisi de le faire en définissant BLUEBIRD_W_FORGOTTEN_RETURN=0 dans mon environnement.

12
Gunar Gessner

Ne désactivez pas les avertissements. Ils sont là pour une raison.

Le modèle typique est que si votre gestionnaire onfulfill ou onreject provoque la construction d'une promesse, il retournera cette promesse (ou une chaîne dérivée de celle-ci) du gestionnaire, de sorte que la chaîne adopte l'état de cette promesse.

Bluebird surveille donc quand il exécute l'une de vos fonctions de gestionnaire, et suit également quand son constructeur Promise est appelé. S'il détermine qu'une promesse a été créée à n'importe quel point pendant que votre gestionnaire est en cours d'exécution (cela inclut n'importe où dans la pile des appels), mais que cette promesse a été pas retournée par votre gestionnaire, il émet cet avertissement car il pense que vous avez probablement oublié pour écrire la déclaration de retour.

Donc, si vous ne vous souciez pas légitimement de la promesse qui a été créée dans le gestionnaire, tout ce que vous avez à faire est de renvoyer explicitement quelque chose de votre gestionnaire. Si vous ne vous souciez pas de ce qui est retourné par votre gestionnaire (c'est-à-dire si vous ne vous souciez pas de la valeur de la promesse), renvoyez simplement null. Quoi que vous retourniez, le retour explicite (en particulier, une valeur de retour autre que undefined) indique à Bluebird que vous pensez savoir ce que vous faites, et il n'émettra pas cet avertissement.

10
brianmearns

Assurez-vous que chaque endroit où vous avez une instruction return, qui est la solution, fonctionne pour moi.

0
Sanjay Kumar N S