Использование обещаний в функции async

Я пытаюсь прослушать вызов веб-перехватчика Stripe, а затем выполнить некоторые действия, например отправить электронное письмо. Мой сайт находится на Netlify, и я адаптировал код, который нашел в учебнике:

Это работает локально, но не когда я запускаю его как функцию Netlify (в основном лямбда). По сути, часть из client.getSpace.. не запускается вообще. Я подозреваю, что это как-то связано с использованием этих обещаний.then в функции async, но я не уверен.

require('dotenv').config();
     const stripe = require('stripe')(process.env.STRIPE_SECRET_KEY);
    
     const contentful = require('contentful-management');
     const client = contentful.createClient({
      accessToken: 
    process.env.CONTENTFUL_CONTENT_MANAGEMENT_ACCESS_TOKEN
    });
    
    var postmark = require("postmark");
    var serverToken = process.env.POSTMARK_SERVER_TOKEN;
    var postmark_client = new postmark.ServerClient(serverToken);
    
    exports.handler = async ({ body, headers }) => {
    try {
      const stripeEvent = stripe.webhooks.constructEvent(
        body,
        headers['stripe-signature'],
        process.env.STRIPE_WEBHOOK_SECRET
      );
    
      if (stripeEvent.type === 'checkout.session.completed') {
       console.log('confirm checkout session completed');
        const eventObject = stripeEvent.data.object;
        const entryId = eventObject.client_reference_id;
        let email = "";
        let secret = "";
    
      client.getSpace(process.env.WEBSITE_CONTENTFUL_SPACE_ID)
       .then(space => space.getEnvironment('master'))
          .then(environment => environment.getEntry(entryId))
          .then(entry => {
           entry.fields.paymentStatus['en-GB'] = 'Paid';
           email = entry.fields.email['en-GB'];
           return entry.update();
          })
          .then(entry => entry.publish())
       .then(entry => postmark_client.sendEmailWithTemplate({
              "From": "x@test.com",
              "To": email,
              "TemplateId": 12345678,
              "TemplateModel": {
                  "abc": "xyz"
               }
            }))
          .catch(console.error)
    
      }
    
      return {
        statusCode: 200,
        body: JSON.stringify({ received: true }),
      };
      } catch (err) {
      console.log(`Stripe webhook failed with ${err}`);
    
      return {
        statusCode: 400,
        body: `Webhook Error: ${err.message}`,
      };
    }
    };

1 ответ

Для чего это стоит вам и всем, кто сталкивается с этим вопросом. У меня была аналогичная проблема с использованием NextJS на Vercel. Я переписал синтаксис .then, используя async/await, и пока проблема, кажется, решена. Я не эксперт, но я думаю, что в этом случае вы бы начали с замены

        client.getSpace(process.env.WEBSITE_CONTENTFUL_SPACE_ID)
    .then(space => space.getEnvironment('master'))

с чем-то вроде

             const send = await client.getSpace(process.env.WEBSITE_CONTENTFUL_SPACE_ID)
       const getEnvironment = await space.getEnvironment('master')

так далее и так далее. Я не уверен, как бы вы переписали все остальное, и поможет ли это вообще, но это вернуло меня в нужное русло.

Другие вопросы по тегам