gpt4 book ai didi

node.js - 请求 Promise 未处理拒绝

转载 作者:太空宇宙 更新时间:2023-11-04 03:00:13 24 4
gpt4 key购买 nike

基本上,我必须执行 POST 请求,在收到此 POST 的返回结果并将此信息保存到数据库后,尝试将此数据保存到 API 上。

因此,我在另一个 Promise 中调用了 Promise (saveProcessedData 或 saveErrorData),尽管抛出了警告,但仍按预期工作:

Unhandled rejection StatusCodeError: 400

const sendData = async(data, item) => {

let payload = [],
dataProcessed = [];

let options = {
method: data.endpoint.method,
url: api._url + data.endpoint.url,
headers:
{
'Postman-Token': api._postmanToken,
'cache-control': api._cache,
'x-ccasset-language': 'en',
Authorization: data.token
},
body: item,
json: true
};

return new Promise((resolve, reject) => {
api._request(options, async (error, response, body) => {
if(!response.body.errorCode && response.statusCode === 200) {
payload = {
body: response.body,
type: data.req.body.type
}
dataProcessed = await db.saveProcessedData(payload);
} else {
payload = {
body: item,
type: data.req.body.type,
description: response.body.message
}
dataProcessed = await db.saveErrorData(payload);
}

if (error) {
reject(error)
}

resolve(dataProcessed);
});
});
}

我怎样才能捕获这个错误?

最佳答案

如果您不混合回调和 promise ,那就更好了。您收到该错误是因为您没有在 api._request 回调中正确处理错误。

将您的代码包装在 try/catch 的回调中,因为这就是您在 async 函数中处理异常的方式。

new Promise(async resolve => {
await Promise.reject() // Unhandled Promise Rejection
}).catch(console.error) // not catched

应该是:

new Promise(async resolve => {
try {
await Promise.reject()
resolve();
} catch(e) {
reject(e)
}

}).catch(console.error) // catched

无论如何,由于您将 api._request 包装在 Promise 中,所以最好这样做:


const sendData = async(data, item) => {

// ...

const { error, response, body } = await new Promise((resolve, reject) => {
api._request(options, (error, response, body) => resolve({ error, response, body }))
})

if(!response.body.errorCode && response.statusCode === 200) {
payload = {
body: response.body,
type: data.req.body.type
}
dataProcessed = await db.saveProcessedData(payload);
} else {
payload = {
body: item,
type: data.req.body.type,
description: response.body.message
}
dataProcessed = await db.saveErrorData(payload);
}

return dataProcessed;
}

并将 .catch 处理程序附加到 .sendData

除此之外,如果 error 为真,则您将拒绝然后解决,在这种情况下不会发生任何错误,但最好使用 returnreject()。 promise ,无法拒绝和解决。

if (error) {
return reject(error)
}

resolve(dataProcessed);
<小时/>

如果您使用 request,则可以使用 request-promiserequest-promise-native,它们是 request 包的 Promise 包装器。

关于node.js - 请求 Promise 未处理拒绝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59358758/

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