【问题标题】:Lambda function sometimes returns a null value for data when calling stripe api调用 stripe api 时,Lambda 函数有时会为数据返回空值
【发布时间】:2021-02-20 03:43:45
【问题描述】:

我的 lambda 函数偶尔会出现以下错误

{
    "errorType": "TypeError",
    "errorMessage": "Cannot read property 'data' of null",
    "stack": [
        "TypeError: Cannot read property 'data' of null",
        "    at /var/task/app.js:86:21",
        "    at Timeout._onTimeout (/var/task/node_modules/stripe/lib/utils.js:324:13)",
        "    at listOnTimeout (internal/timers.js:549:17)",
        "    at processTimers (internal/timers.js:492:7)"
    ]
}

我想知道在我的代码中是否有一种方法,如果条带调用失败(我认为这是正在发生的事情),那么我可以重试,否则不知道该怎么做。这是我的代码

// const axios = require('axios')
// const url = 'http://checkip.amazonaws.com/';

const sanityClient = require("@sanity/client");
const client = sanityClient({
  projectId: "fdsa...",
  dataset: "development",
  token: process.env.SANITY_TOKEN_WRITE,
});
const fetch = require("node-fetch");
const stripe = require("stripe")(`${process.env.STRIPE}`);

let response;

/**
 *
 * Event doc: https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html#api-gateway-simple-proxy-for-lambda-input-format
 * @param {Object} event - API Gateway Lambda Proxy Input Format
 *
 * Context doc: https://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-context.html
 * @param {Object} context
 *
 * Return doc: https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html
 * @returns {Object} object - API Gateway Lambda Proxy Output Format
 *
 */
exports.lambdaHandler = async (event, context, callback) => {
  if (event.httpMethod === "POST") {
    response = {
      statusCode: 200,
      body: JSON.stringify({
        message: "hello world",
        // location: ret.data.trim()
      }),
    };

    //console.log(event.body);

    const payload = JSON.parse(event.body);

    async function retrieveProduct() {
      const product = await stripe.checkout.sessions.listLineItems(
        payload.data.object.id,
        { limit: 5 },
        function (err, lineItems) {
          console.log(lineItems);

          let query;
          lineItems.data.map((item) => {
            //console.log(item);

            //console.log(item.id);

            query = `*[_type == "products" && product_id == "${item.price.product}"]`;
            //console.log(query);

            client.fetch(query, {}).then((documents) => {
              //console.log("document");
              //console.log(documents);
              //console.log(documents[0]._id);
              //console.log("document");
              documents.forEach((document) => {
                client
                  .patch(document._id) // Document ID to patch
                  .set({ sold: true }) // Shallow merge
                  .commit()
                  .then((result) => {
                    // console.log(result);
                  });
              });
            });
          });
        }
      );
    }

    async function purchaseRecord() {
      const product = await stripe.checkout.sessions.listLineItems(
        payload.data.object.id,
        { limit: 5 },
        function (err, lineItems) {
          //console.log(lineItems);

          let arr = [];

          lineItems.data.map((item, i) => {
            arr.push({
              _type: "line_items",
              _key: `f83nf893n${i}`,
              line_items: item.price.product,
              line_items_desc: item.description,
            });
            //console.log(item);
          });

          console.log(arr);

          const doc = {
            _type: "purchases",
            cs_id: payload.data.object.id,
            customer_id: payload.data.object.customer,
            amount_total: payload.data.object.amount_total,
            line_items_wrapper: arr,
          };

          client.create(doc).then((res) => {
            console.log(`Purchase was created, document ID is ${res._id}`);
          });
        }
      );
    }

    purchaseRecord();

    retrieveProduct();
  }

  if (event.httpMethod === "GET") {
    try {
      // const ret = await axios(url);
      response = {
        statusCode: 200,
        body: JSON.stringify({
          message: "hello world",
          // location: ret.data.trim()
        }),
      };
    } catch (err) {
      console.log(err);
      return err;
    }
  }

  callback(null, response);
};

代码在 90% 的时间里运行,但这个错误偶尔会发生。

提前谢谢

【问题讨论】:

    标签: node.js amazon-web-services aws-lambda stripe-payments


    【解决方案1】:

    用这个改变 if 块,你可以得到错误消息而不是 null

      if (event.httpMethod === "GET") {
        try {
          // const ret = await axios(url);
          response = {
            statusCode: 200,
            body: JSON.stringify({
              message: "hello world",
              // location: ret.data.trim()
            }),
          };
          callback(null, response);
    
        } catch (err) {
          console.log(err);
          callback(Error(err));
    
        }
      }
    

    【讨论】:

      【解决方案2】:

      我认为这与 GET 请求无关。

      我不确定第 86 行在哪里,但我认为有时 const payload = JSON.parse(event.body); 是空的,因此您应该在继续尝试处理之前检查它是否实际上包含 data 字段。

      【讨论】:

      • 更正发布请求中发生的错误。我会试试这个,然后回来选择这个答案。谢谢
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-19
      • 1970-01-01
      • 1970-01-01
      • 2018-02-14
      • 1970-01-01
      相关资源
      最近更新 更多