gpt4 book ai didi

javascript - 停止 Bluebird Promise 中的错误传播

转载 作者:行者123 更新时间:2023-12-03 10:40:49 29 4
gpt4 key购买 nike

如何阻止抛出的错误沿着链一路传播?它显示在我的 catch() block 中,但它不会停止并因未捕获的异常而使服务器崩溃。

我将其作为节点 cron 作业 (node-cron) 的一部分运行,如下所示:

var cronJob = require('cron').CronJob;
var cron = require('../lib/cron')

var c = new cronJob('* * * * * *', function() {
console.log('Cron starting');
mycode.run();
}, function() {
console.log('Cron executed');
}, true);
c.start();

在我的 cron.js 中

  module.exports = {
run: function() {
return job.getAndStore().catch(function(e) {
// This prints but it keeps on going so to speak - it doesn't 'catch', just notifies me
console.log('ERROR', e);
});
}
};

控制台转储:

Cron starting
ERROR [TypeError: undefined is not a function]
Cron starting
Uncaught Exception
[TypeError: undefined is not a function]
TypeError: undefined is not a function

我必须这样做,但我知道不太正确:

try {
run();
} catch(e) {
console.log('Now it stops')
}

run() 是某些 cron 库的一部分,该库没有任何 Promise 支持,因此我将其包装在函数中来调用它。

编辑因为我认为我的问题与后续调用有关,所以我相信这与我在 2 个以上调用上处理 Mongo 连接的方式有关:

    //  Create a Mongo connection
Job.prototype.getDb = function(id) {
var self = this;
return new P(function(resolve, reject) {
if (!self.db) {
return Mongo.connectAsync(self.options.connection)
.then(function(c) {
self.db = c;
debug('Got new connection');
resolve(c);
});
}
debug('Got existing connection');
resolve(self.db);
});
};

// Fetch stuff
Job.prototype.getAndStore = function(c) {
return this.getDb().then(function() {
throw new Error('Boom');
});
};

最佳答案

您的 catch 回调仅在第一次执行。您在 cron 作业的第二次运行中遇到了未捕获的异常,并且您的 job.getAndStore() 看起来没有返回被拒绝的 promise ,而是同步抛出。不应该的,它should always return a promise .

您可以使用Bluebirds Promise.try自动捕获此类异常并将其转换为 promise 拒绝。或者您将 getAndStore 函数包装在 Promise.method 中:

var safeGetAndStore = Promise.method(job.getAndStore.bind(job));

module.exports = {
run: function() {
return safeGetAndStore().catch(function(e) {
console.log('ERROR', e);
});
}
};
<小时/>

在您的具体情况下,问题是您的 job 确实缓存了 db 连接并在它已经可用时返回该连接 - 但您需要返回一个 promise 一个 .then 方法。您应该简单地缓存 promise 本身:

Job.prototype.getDb = function(id) {
if (!this.db) {
this.db = Mongo.connectAsync(self.options.connection);
return this.db;
};

关于javascript - 停止 Bluebird Promise 中的错误传播,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28787427/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com