簡體   English   中英

Firebase 函數從外部 API 調用返回錯誤文本

[英]Firebase functions return error text from external API call

我正在使用 Firebase 函數通過 square 處理信用卡。 我的 function 非常適合成功的卡交易。 但是,對於諸如拒絕或不正確的 cvv 之類的卡錯誤,我想將該錯誤上下文發送給用戶。 我當前的代碼會發生什么我只是從雲 function 收到錯誤 500。 當我查看 function 日志時,它有一個未處理的錯誤 { 錯誤:錯誤請求...我可以在日志中看到所需的文本,但這並沒有傳遞到前端。 這是我當前的代碼。

export const processPayment = functions.https.onCall((data, context) => {
  squareSetup();
  const request_params = data;
  const idempotency_key = crypto.randomBytes(22).toString('hex');
  const payments_api = new squareConnect.PaymentsApi();
  const request_body = {
    source_id: request_params.nonce,
    amount_money: {
      amount: Math.round(request_params.amount * 100),
      currency: 'USD' as squareConnect.CurrencyType
    },
    tip_money: {
      amount: Math.round(request_params.tipAmount * 100),
      currency: 'USD' as squareConnect.CurrencyType
    },
    idempotency_key: idempotency_key
  };
  return payments_api.createPayment(request_body);
});

根據此處找到的 api 。 我應該得到一個錯誤類型數組的響應。 但是,當我像這樣在 api promise 上使用捕獲器時

return payments_api.createPayment(request_body).catch(err => console.log(err))

不是這樣的。 相反,它似乎是一個完整的錯誤響應

{ Error: Bad Request
at Request.callback (/srv/node_modules/superagent/lib/node/index.js:706:15)
at parser (/srv/node_modules/superagent/lib/node/index.js:916:18)
at IncomingMessage.res.on (/srv/node_modules/superagent/lib/node/parsers/json.js:19:7)
at emitNone (events.js:111:20)
at IncomingMessage.emit (events.js:208:7)
at endReadableNT (_stream_readable.js:1064:12)
at _combinedTickCallback (internal/process/next_tick.js:139:11)
at process._tickDomainCallback (internal/process/next_tick.js:219:9)
  status: 400,
  response: 
   Response {
     domain: 
      Domain {
        domain: null,
        _events: [Object],
        _eventsCount: 1,
        _maxListeners: undefined,
        members: [Array] },
     _events: {},
     _eventsCount: 0,
     _maxListeners: undefined,
     res: 
      IncomingMessage {
        _readableState: [Object],
        readable: false,
        domain: [Object],
        _events: [Object],
        _eventsCount: 4,
        _maxListeners: undefined,
        socket: [Object],
        connection: [Object],
        httpVersionMajor: 1,
        httpVersionMinor: 1,
        httpVersion: '1.1',
        complete: true,
        headers: [Object],
        rawHeaders: [Array],
        trailers: {},
        rawTrailers: [],
        aborted: false,
        upgrade: false,
        url: '',
        method: null,
        statusCode: 400,
        statusMessage: 'Bad Request',
        client: [Object],
        _consuming: true,
        _dumped: false,
        req: [Object],
        text: '{"errors": [{"code": "CVV_FAILURE","detail": "Authorization error: \'CVV_FAILURE\'","category": "PAYMENT_METHOD_ERROR"}],"payment": {"id": "xq1y6ue6tKTZhAdbWJUwf5WHsobZY","created_at": "2020-05-19T22:45:36.408Z","updated_at": "2020-05-19T22:45:36.516Z","amount_money": {"amount": 2030,"currency": "USD"},"tip_money": {"amount": 0,"currency": "USD"},"status": "FAILED","delay_duration": "PT168H","source_type": "CARD","card_details": {"status": "FAILED","card": {"card_brand": "VISA","last_4": "1111","exp_month": 12,"exp_year": 2021,"fingerprint": "sq-1-jEohVzE5NqHD6_pF2AVfTSFbT1rRlEpA-FxCHw3ZEx1w3VgafAXvemqYf_AyJN7Dyg","card_type": "CREDIT","bin": "411111"},"entry_method": "KEYED","cvv_status": "CVV_REJECTED","avs_status": "AVS_ACCEPTED","errors": [{"code": "CVV_FAILURE","detail": "Authorization error: \'CVV_FAILURE\'","category": "PAYMENT_METHOD_ERROR"}]},"location_id": "NQYE9M4YWEVJ9","order_id": "grj0Ni4UoMVWdjhUG7NbRSWibb4F","total_money": {"amount": 2030,"currency": "USD"},"delay_action": "CANCEL","delayed_until": "2020-05-26T22:45:36.408Z"}}\n',
        read: [Function] },
     request: 
      Request {
        domain: [Object],
        _events: {},
        _eventsCount: 0,
        _maxListeners: undefined,
        _agent: false,
        _formData: null,
        method: 'POST',
        url: 'https://connect.squareupsandbox.com/v2/payments',
        _header: [Object],
        header: [Object],
        writable: true,
        _redirects: 0,
        _maxRedirects: 5,
        cookies: '',
        qs: {},
        _query: [],
        qsRaw: [],
        _redirectList: [],
        _streamRequest: false,
        _timeout: 60000,
        _responseTimeout: 0,
        _data: [Object],
        req: [Object],
        protocol: 'https:',
        host: 'connect.squareupsandbox.com',
        _endCalled: true,
        _callback: [Function],
        res: [Object],
        response: [Circular],
        called: true },
     req: 
      ClientRequest {
        domain: [Object],
        _events: [Object],
        _eventsCount: 3,
        _maxListeners: undefined,
        output: [],
        outputEncodings: [],
        outputCallbacks: [],
        outputSize: 0,
        writable: true,
        _last: true,
        upgrading: false,
        chunkedEncoding: false,
        shouldKeepAlive: false,
        useChunkedEncodingByDefault: true,
        sendDate: false,
        _removedConnection: false,
        _removedContLen: false,
        _removedTE: false,
        _contentLength: 203,
        _hasBody: true,
        _trailer: '',
        finished: true,
        _headerSent: true,
        socket: [Object],
        connection: [Object],
        _header: 'POST /v2/payments HTTP/1.1\r\nHost: connect.squareupsandbox.com\r\nAccept-Encoding: gzip, deflate\r\nUser-Agent: Square-Connect-Javascript/3.20200422.1\r\nAuthorization: Bearer EAAAEP4ScCd1MuybJhfZaTDovR_0KG06LwxrKdREpSnKhNUZ2_3T0kH0AcUycdgI\r\nSquare-Version: 2020-04-22\r\nContent-Type: application/json\r\nAccept: application/json\r\nContent-Length: 203\r\nConnection: close\r\n\r\n',
        _onPendingData: [Function: noopPendingOutput],
        agent: [Object],
        socketPath: undefined,
        timeout: undefined,
        method: 'POST',
        path: '/v2/payments',
        _ended: true,
        res: [Object],
        aborted: undefined,
        timeoutCb: null,
        upgradeOrConnect: false,
        parser: null,
        maxHeadersCount: null,

我可以在名為 text 的屬性下看到來自 api 的預期錯誤響應,但我不確定如何深入研究該數據

您需要處理錯誤,如文檔中所述:

為確保客戶端獲得有用的錯誤詳細信息,請通過拋出(或返回被拒絕的 Promise) functions.https.HttpsError實例從可調用對象中返回錯誤。

因此,在您的情況下,您應該執行以下操作(我假設createPayment()方法返回一個 Promise):

export const processPayment = functions.https.onCall((data, context) => {
  //...
  return payments_api.createPayment(request_body)
  .catch(error => {
     throw new functions.https.HttpsError('<error-code>', '....');
  })
});

可能的錯誤代碼列表在這里


您將在此處找到有關如何處理客戶端錯誤的一些示例。

通過簡單地向下鑽取,我能夠得到預期的響應

return payments_api.createPayment(request_body).catch((err) => console.log(err.response.text));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM