node.js - 请求 Promise 未处理的拒绝
问题描述
基本上,在我收到此 POST 的返回并将此信息保存在数据库中后,我必须执行 POST 请求并尝试将这些数据保存在 API 上。
所以,我(saveProcessedData or saveErrorData)
在另一个承诺中调用了一个承诺,尽管发出了警告,但仍按预期工作:
未处理的拒绝状态代码错误: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);
});
});
}
我怎样才能捕捉到这个错误?
解决方案
如果您不以您的方式混合回调和承诺,那就更好了。您收到该错误是因为您没有在api._request
回调中正确处理错误。
将您的代码包装在 a 中的回调中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
是真的,你拒绝然后resolving
,在这种情况下不会发生任何错误,但最好使用return reject()
. 一个承诺,不能被拒绝和解决。
if (error) {
return reject(error)
}
resolve(dataProcessed);
如果你正在使用request
,你可以使用request-promise
or request-promise-native
which 是包的 Promise 包装器request
。
推荐阅读
- react-native - 升级 sdk 33.0 后,expo react-native 移动应用程序不起作用?
- jenkins - Jenkins EC2 插件在构建作业时立即启动和停止实例
- javascript - 应用程序脚本。如何从所有记录中收集所有数据?火力基地
- hyperledger-fabric - Hyperledger Fabric 中的 orderer 和网络组织之间是否存在任何关系?
- mysql - MySQL/MariaDB:汇总多个不同的工作时间倒数以确定办公室何时开放?
- google-chrome - 我在用户页面中使用 JSP Servlets 保存了用户名和密码。但是在登录页面中它不检查凭据
- reactjs - ReactJS - 喜欢和不同使用相同的按钮 - 更新而不刷新页面
- c# - OnJoinedRoom 未被调用
- python - 使用 Windows 和 Linux 动态导入 Python 模块
- excel - 无法将数据从一张表剪切和粘贴到另一张表