ошибка чтения ECONNRESET при работе с HTTP-запросом в облачной функции - PullRequest
0 голосов
/ 22 марта 2020

Я пытаюсь отправить почтовый запрос в конечную точку App Store verifyReceipt в облачной функции Firebase. Тем не менее, я получаю следующую ошибку в журнале облачных функций:

{ Error: read ECONNRESET
    at TLSWrap.onread (net.js:622:25)
  errno: 'ECONNRESET',
  code: 'ECONNRESET',
  syscall: 'read',

Однако эта ошибка только случайная. Это не происходит каждый раз, так что функция, очевидно, работает, но иногда что-то идет не так, и я не уверен, что.

Большинство других решений, связанных с этим, были из-за ошибки обещания, но я не считаю, что это проблема здесь. Ниже приведена полная функция:

exports.handleSubscriptionIAP_IOS_S2S = functions.https.onRequest((req, res) => {
    let data = req.body;

    console.log('received ios s2s notification with body:', data);

    let base64String = data.unified_receipt.latest_receipt;

    let boolStatus = true;
    // The user has changed the auto renewal status, store the change
    if(data.notification_type === 'DID_CHANGE_RENEWAL_STATUS') {
        boolStatus = (data.auto_renew_status === 'true');
    }

    console.log(data.notification_type);

    if(base64String) {
        var options = {
            method: 'post',
            url: 'https://buy.itunes.apple.com/verifyReceipt',
            data: ({
                "receipt-data" : base64String,
                "password" : "***",
                "exclude-old-transactions" : true
            })
        };

        var optionsSandbox = {
            method: 'post',
            url: 'https://sandbox.itunes.apple.com/verifyReceipt',
            data: ({
                "receipt-data" : base64String,
                "password" : "***",
                "exclude-old-transactions" : true
            })
        };

        return axios(options)
        .then((response) => {
            if(response.data.status === 21007) {
                return 'handle_sandbox';
            }

            // Got valid response from Apple, pass down chain
            else {
                return response;
            }
        })
        .then((response) => {
            // Send post request to sandbox endpoint
            if(response === 'handle_sandbox') {
                return axios(optionsSandbox);
            }

            // Pass response down chain
            else {
                return response;
            }
        })
        .then((response) => {
            // Handle response from Apple verifyReceipt endpoint here
            // Both production and sandbox will end up here
            // See here for values in response.data: https://developer.apple.com/documentation/appstorereceipts/responsebody/latest_receipt_info

            console.log('received ios s2s notification verify receipt response with body:', response.data);
            // Status 0 means request is valid
            if(response.data.status === 0) {
                // Get receipt info of latest receipt
                // Only one object in array is return since we exclude old transactions
                let latestReceipt = response.data.latest_receipt_info[0];

                // Save receipt into Firestore
                return db.collection('appStoreReceipts').doc(latestReceipt.original_transaction_id).set({
                    latest_receipt_info: latestReceipt,

                    expiresTimestamp: admin.firestore.Timestamp.fromMillis(parseInt(latestReceipt.expires_date_ms)),
                    originalTransactionID: latestReceipt.original_transaction_id,

                    autoRenewStatus: boolStatus,

                    base64Receipt: response.data.latest_receipt,
                }, { merge: true });
            }
            else {
                return null;
            }
        })
        .then((result) => {
            if(result) {
                return res.status(200).end();
            }
            else {
                return res.status(400).end();
            }
        })
        .catch((error) => {
            console.log('an error occured handling the subscription', error);

            return res.status(400).end();
        })
    }
    else {
        console.log('invalid receipt', data);

        return res.status(400).end();
    }
});

Спасибо за любую помощь, которую вы можете оказать!

1 Ответ

0 голосов
/ 22 марта 2020

ECONNRESET просто означает, что другой конец соединения закрыл его. Это может означать любое количество вещей. Возможно, это не ошибка вашего кода, если вы не сделали что-то настолько плохое в этом одном запросе, что Apple решила закрыть соединение. Вам следует обратиться в их службу поддержки напрямую, если вы считаете, что они делают это неправильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...