首页 > 解决方案 > 请求 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);
        });
    });
}

我怎样才能捕捉到这个错误?

标签: node.jsrequest

解决方案


如果您不以您的方式混合回调和承诺,那就更好了。您收到该错误是因为您没有在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-promiseor request-promise-nativewhich 是包的 Promise 包装器request


推荐阅读