Использование обещаний в функции 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')
так далее и так далее. Я не уверен, как бы вы переписали все остальное, и поможет ли это вообще, но это вернуло меня в нужное русло.