蓝鸟被遗忘的退货警告丢失

时间:2019-01-19 11:13:00

标签: javascript node.js bluebird

我希望Bluebird forgotten return warning出现,但是由于某些原因它不起作用。

一个demo

const Bluebird = require('bluebird');

Bluebird.config({
    warnings: true
})

Bluebird.resolve(1)
.then(() => {
    Bluebird.resolve(2); // should warn about forgotten return
})
.then(two => console.log(two));

如何解决警告输出问题?

我怀疑我之前已经遇到过这个问题,但是我不记得该怎么解决。

3 个答案:

答案 0 :(得分:4)

似乎需要启用长堆栈跟踪才能显示警告。您可以使用config对象启用它们(docs)(demo):

Bluebird.config({
    warnings: true,
    longStackTraces: true
});

或环境变量(docs)(demo):

  

在Node.js中,您可以为以下内容配置警告和长堆栈跟踪:   使用环境变量的整个过程:

BLUEBIRD_LONG_STACK_TRACES=1 BLUEBIRD_WARNINGS=1 node app.js
     

如果BLUEBIRD_DEBUG会自动启用这两个功能   环境变量已设置,或者是否设置了NODE_ENV环境   变量等于“开发”。

  

要在节点开发中启用长堆栈跟踪和警告:

$ NODE_ENV=development node server.js
     

要在节点生产中启用长堆栈跟踪和警告:

$ BLUEBIRD_DEBUG=1 node server.js
     

请参见Environment Variables


编辑为什么要这样做:

似乎默认情况下禁用警告和长堆栈跟踪,并且仅在检测到开发环境时才启用,请参见here

  

请注意,即使此处的默认设置为false,也可能会检测到开发环境,该环境会自动启用长堆栈跟踪和警告。

要使警告显示在生产环境中,不仅需要启用警告,还必须启用长堆栈跟踪,请参见herehere

答案 1 :(得分:2)

您可以通过配置对象中的wForgottenReturnlongStackTraces属性之间的组合来配置警告,以检查忘记的返回语句。 wForgottenReturnwarning的属性,必须设置为true,并且是唯一可以单独配置的警告类型。相应的环境变量键为BLUEBIRD_W_FORGOTTEN_RETURN。您可以查看documentation了解更多信息。

const Bluebird = require('bluebird');

Bluebird.config({
    warnings: {
        wForgottenReturn: true
    }, longStackTraces: true,
});


Bluebird.resolve(1).then(() => {
   Bluebird.resolve(2);
}).then(two => console.log(two));

在控制台中运行程序会给我:

Warning: a promise was created in a handler at /home/adrianpop/test/bb.js:11:13 but was not returned from it, see 
    at Function.Promise.cast (/home/adrianpop/Downloads/Test/node_modules/bluebird/js/release/promise.js:196:13)
undefined

这是您想要的输出。

您还可以通过以下方式运行该应用程序:

BLUEBIRD_LONG_STACK_TRACES=1 BLUEBIRD_WARNINGS=1 node app.js,产生相同的结果。

干杯!

编辑:

从github上的this问题来看,我们有:

  

所以问题是默认情况下Nodejs 6.x不显示堆栈   跟踪警告。有一个命令行选项(--trace-warnings)   使他们。没有此选项,蓝鸟警告会少很多   有用。如果没有调用堆栈,很难弄清楚   警告的来源。

也可以找到更多信息:

答案 2 :(得分:1)

用一个词回答您的问题

  

如何解决警告输出问题?

通过启用长堆栈跟踪

const Bluebird = require('bluebird');

Bluebird.config({
    warnings: true,
    longStackTraces: true
})

Bluebird.resolve(1)
.then(() => {
    Bluebird.resolve(2); // should warn about forgotten return
})
.then(two => console.log(two));

现在应该使您以new demo结尾,该错误将标记您此错误:

(node:65) Warning: a promise was created in a handler at evalmachine.<anonymous>:16:14 but was not returned from it, see http://bluebirdjs.com/docs/warning-explanations.html#warning-a-promise-was-created-in-a-handler-but-was-not-returned-from-it
    at Function.Promise.cast (/home/runner/node_modules/bluebird/js/release/promise.js:196:13)
undefined

promise.js 文件:


Promise.cast = function (obj) {
    var ret = tryConvertToPromise(obj);
    if (!(ret instanceof Promise)) {
        ret = new Promise(INTERNAL);
        ret._captureStackTrace(); //promise.js:196:13 
        ret._setFulfilled();
        ret._rejectionHandler0 = obj;
    }
    return ret;
};

请记住,在 Node.js 中,您可以选择使用环境变量为整个过程配置警告和长堆栈跟踪。


深入了解bluebird的源代码


var warnings = !!(util.env("BLUEBIRD_WARNINGS") != 0 &&
    (debugging || util.env("BLUEBIRD_WARNINGS")));

var longStackTraces = !!(util.env("BLUEBIRD_LONG_STACK_TRACES") != 0 &&
    (debugging || util.env("BLUEBIRD_LONG_STACK_TRACES")));

var wForgottenReturn = util.env("BLUEBIRD_W_FORGOTTEN_RETURN") != 0 &&
    (warnings || !!util.env("BLUEBIRD_W_FORGOTTEN_RETURN"));

Promise.config = function(opts) {
    opts = Object(opts);
    if ("longStackTraces" in opts) {
        if (opts.longStackTraces) {
            Promise.longStackTraces();
        } else if (!opts.longStackTraces && Promise.hasLongStackTraces()) {
            disableLongStackTraces();
        }
    }
    if ("warnings" in opts) {
        var warningsOption = opts.warnings;
        config.warnings = !!warningsOption;
        wForgottenReturn = config.warnings;

        if (util.isObject(warningsOption)) {
            if ("wForgottenReturn" in warningsOption) {
                wForgottenReturn = !!warningsOption.wForgottenReturn;
            }
        }
    }
    if ("cancellation" in opts && opts.cancellation && !config.cancellation) {
        if (async.haveItemsQueued()) {
            throw new Error(
                "cannot enable cancellation after promises are in use");
        }
        Promise.prototype._clearCancellationData =
            cancellationClearCancellationData;
        Promise.prototype._propagateFrom = cancellationPropagateFrom;
        Promise.prototype._onCancel = cancellationOnCancel;
        Promise.prototype._setOnCancel = cancellationSetOnCancel;
        Promise.prototype._attachCancellationCallback =
            cancellationAttachCancellationCallback;
        Promise.prototype._execute = cancellationExecute;
        propagateFromFunction = cancellationPropagateFrom;
        config.cancellation = true;
    }
    if ("monitoring" in opts) {
        if (opts.monitoring && !config.monitoring) {
            config.monitoring = true;
            Promise.prototype._fireEvent = activeFireEvent;
        } else if (!opts.monitoring && config.monitoring) {
            config.monitoring = false;
            Promise.prototype._fireEvent = defaultFireEvent;
        }
    }
    return Promise;
};

默认情况下,通过将false置于生产环境中,可以禁用长堆栈跟踪,警告,监视和取消。在开发环境中打开调试器时,它们会被检测并自动启用。

我建议您再经历bluebird's documentation

Promise.config

Promise.config(Object {
    warnings: boolean=false,
    longStackTraces: boolean=false,
    cancellation: boolean=false,
    monitoring: boolean=false
} options) -> Object;

配置长堆栈跟踪,警告,监视和取消。请注意,即使false是此处的默认设置,也可能会检测到开发环境,该环境会自动启用长堆栈跟踪和警告。

Promise.config({
    // Enable warnings
    warnings: true,
    // Enable long stack traces
    longStackTraces: true,
    // Enable cancellation
    cancellation: true,
    // Enable monitoring
    monitoring: true
});

您可以使用wForgottenReturn配置警告以检查忘记的返回语句:

Promise.config({
    // Enables all warnings except forgotten return statements.
    warnings: {
        wForgottenReturn: false
    }
});

wForgottenReturn是唯一可以单独配置的警告类型。相应的环境变量键为BLUEBIRD_W_FORGOTTEN_RETURN


在Node.js中,您可以使用环境变量为整个过程配置警告和长堆栈跟踪:

BLUEBIRD_LONG_STACK_TRACES=1 BLUEBIRD_WARNINGS=1 node app.js

如果已设置BLUEBIRD_DEBUG环境变量或NODE_ENV环境变量等于"development",则将自动启用这两个功能。

使用值0将显式禁用某个功能,即使在调试环境下也可以将其激活:

# Warnings are disabled despite being in development environment
NODE_ENV=development BLUEBIRD_WARNINGS=0 node app.js

您可能想从bluebird的贡献者之一中查看此official source