gpt4 book ai didi

node.js - 嵌套 Promise 不会将错误传播到 Node.js 中的父 Promise?

转载 作者:行者123 更新时间:2023-12-03 22:23:48 24 4
gpt4 key购买 nike

我正在使用运行 Express 的 Node.js/TypeScript 创建 API。下面是我的 get 方法的摘录。在 format 方法中触发了一个错误,它抛出一个错误,该错误被 Promise 捕获,但在抛出后不会传播到父 Promise:

            this.getModel(objectName).findAll(queryParameters).then(function(databaseObjects) {
for (let databaseObject of databaseObjects) {
var jsonObject = {};
//console.log("Database object: ");
//console.log(databaseObject);
transform.baseFormat(databaseObject, jsonObject)
.then(() => transform.format(databaseObject, jsonObject))
.then(() => {
res.locals.retval.addData(jsonObject);
}).catch((e) => {
console.log("Caught error during format of existing object: ");
console.log(e);
throw e;
});
}
})
.then(() => {
if (metadata) {
this.metadata(objectName, false, transform, res.locals.retval);

delete queryParameters.limit;
delete queryParameters.offset;
console.log("RUNNING METADATA COUNT: ");
this.getModel(objectName).count(queryParameters).then(function(count) {
res.locals.retval.setMetadata("records", count);
return next();
}).catch(function(e) {
this.error(e, res);
return next();
});
} else {
console.log("NO METADATA");
return next();
}
})
.catch((e) => {
// TODO: Move status into error() function
console.log("500 Error on GET");
console.error(e);
res.locals.retval.addError(ErrorCode.InternalError, e);
res.status(ErrorCode.InternalError).send(res.locals.retval);
return next();
});

这是输出:
(node:8277) Warning: a promise was created in a handler at /Library/WebServer/adstudio/dist/server.js:555:51 but was not returned from it, see
at Function.Promise.bind (/Library/WebServer/adstudio/node_modules/bluebird/js/release/bind.js:65:20)
Caught error during format of existing object:
Test Error
END FUNCTION HAS BEEN REACHED!

然后请求无法完成。

我已经阅读了很多关于 Promises 的文章,但一直找不到与我类似的问题/解决方案。
  • http://bluebirdjs.com/docs/warning-explanations.html
  • http://taoofcode.net/promise-anti-patterns/
  • https://www.reddit.com/r/javascript/comments/4bj6sm/am_i_wrong_to_be_annoyed_with_promise_error/
  • https://pouchdb.com/2015/05/18/we-have-a-problem-with-promises.html
  • Chained promises not passing on rejection
  • http://wiki.commonjs.org/wiki/Promises/A
  • https://promisesaplus.com/
  • 最佳答案

    在该 for 循环中运行不是异步的,因此您的 promise 基本上在循环完成后立即解决,但在所有格式化完成之前。

    使用 promise 控制流,例如 bluebird 的 Promise.each ,它是串行的或只是 Promise.all 。然后任何异常都会被捕获。

    this.getModel(objectName).findAll(queryParameters).then(function (databaseObjects) {
    var promises = databaseObjects.map(databaseObject => {
    var jsonObject = {}
    // console.log("Database object: ");
    // console.log(databaseObject);
    return transform.baseFormat(databaseObject, jsonObject)
    .then(() => transform.format(databaseObject, jsonObject))
    .then(() => {
    res.locals.retval.addData(jsonObject)
    }).catch((e) => {
    console.log('Caught error during format of existing object: ')
    console.log(e)
    throw e
    })
    })
    return Promise.all(promises)
    })
    .catch((e) => {
    // TODO: Move status into error() function
    console.log('500 Error on GET')
    console.error(e)
    res.locals.retval.addError(ErrorCode.InternalError, e)
    res.status(ErrorCode.InternalError).send(res.locals.retval)
    return next()
    })

    关于node.js - 嵌套 Promise 不会将错误传播到 Node.js 中的父 Promise?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44443563/

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