请求承诺未处理的拒绝

时间:2019-12-16 14:34:33

标签: node.js request

基本上,我必须执行POST请求,然后尝试在获得此POST的返回值并将此信息保存到数据库后,将这些数据保存在API上。

因此,我在另一个promise中调用了一个promise using,尽管发出了警告,但仍按预期工作:

  

未处理的拒绝StatusCodeError:400

(saveProcessedData or saveErrorData)

如何捕获此错误?

3 个答案:

答案 0 :(得分:2)

如果您不混合使用回调并答应您的操作方式,那就更好了。之所以收到该错误,是因为您未在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是真实的,那么您将拒绝,然后resolving,在这种情况下不会发生任何错误,但是最好使用return reject()。一个承诺,不能被拒绝和解决。

if (error) {
   return reject(error)
}

resolve(dataProcessed);

如果您使用的是request,则可以使用request-promiserequest-promise-native这两个request包周围的Promise包装器。

答案 1 :(得分:1)

致电placement="top"时,可以使用sendData()来捕获承诺中发生的异常,包括任何Promise.prototype.catch()

reject()

答案 2 :(得分:1)

只需格式化

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

    const 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 Promise.resolve()
        .then(() =>
            new Promise((resolve, reject) => {
                api._request(options, (error, response) => {
                    if (!response.body.errorCode && response.statusCode === 200) {
                        return resolve(
                            {
                                body: response.body,
                                type: data.req.body.type
                            }
                        );

                    }
                    return reject({
                        body: item,
                        type: data.req.body.type,
                        description: error || response.body.message
                    });
                })
            }))
        .then(payload => db.saveProcessedData(payload))
        .catch(payload => db.saveErrorData(payload))
}
相关问题