Dönüşüm fonksiyonları
Shopify Flow'dan önce her webhook isteğinde JavaScript dönüşüm fonksiyonu çalıştırın: yükü yeniden şekillendirin, istekleri reddedin veya yanıt verin.
Eşleme, bir istekten değerleri alır. Dönüştürme işlevi ise bunun ötesine geçer: Bu, Shopify Flow’dan önce her istekte çalıştırılan kendi JavaScript kodunuzdur; böylece veri yükünü yeniden şekillendirebilir, bir şeyleri arayabilir, isteğin bir iş akışını çalıştırmaya değer olup olmadığına karar verebilir veya çağrıyı yapan tarafa kendiniz yanıt verebilirsiniz.
Bu ayar, bir webhook’un İşlev sekmesinde bulunur. Boş bir düzenleyici, devre dışı olduğu anlamına gelir.
Bir fonksiyonun şekli
export default async function transform(payload, ctx) {
// payload - the parsed request body (JSON, form or XML)
// return an object -> it becomes the payload for mapping and Flow
// return null -> nothing is sent to Flow, and nothing counts
return { ...payload, source: "warehouse" }
}ctx size ne sağlar?
ctx.request |
method, contentType, istek headers’i (gizli bilgiler maskelenmiş) ve query |
ctx.webhook |
Webhook'un id ve name değerleri |
ctx.shop |
Myshopify alan adınız |
ctx.log(...) |
Test panelinde ve Geçmiş bölümünde okuyabileceğiniz bir satır yazar |
await ctx.fetch(url, init) |
Halka açık bir API’yi çağırır |
await ctx.shopify(query, variables) |
Admin GraphQL ile mağaza verilerini okur |
ctx.storage |
Çalışmalar arasında küçük değerleri korur (aşağıya bakınız) |
ctx.respond(body, options) |
Arayan kişiye hemen cevap verir |
Yükün yeniden şekillendirilmesi
En yaygın kullanım: Göndericinin yapısını, iş akışınızın ihtiyaç duyduğu birkaç değere dönüştürmek.
export default async function transform(payload) {
const order = payload.data.attributes
return {
orderNumber: String(order.number),
email: order.customer.email.toLowerCase(),
total: Number(order.total_cents) / 100,
}
}İhtiyacınız olmayan istekleri silme
null döndürürseniz istek o noktada durur: Shopify Flow çalıştırılmaz, geçmişe giriş yapılmaz ve planınızın kotasından hiçbir şey düşülmez. Çağrı yapan tarafa 200 yanıtı, { "skipped": true } ile birlikte gönderilir; böylece yeniden deneme yapılmaz.
export default async function transform(payload, ctx) {
if (payload.status !== "paid" || payload.total < 100) {
ctx.log("skipping", payload.id, payload.status, payload.total)
return null
}
return payload
}Koşular arasında hatırlama
ctx.storage, mağazanıza ait küçük bir anahtar-değer deposudur. Bu, “Bunu daha önce görmüş müydüm?” sorusuna yanıt veren bir araçtır: Bir olay geldiğinde bir kimlik numarası kaydedin ve aynı kimlik numarasını taşıyan bir sonraki isteği, günler sonra gelse bile atlayın.
| Arayın | Acaba |
|---|---|
await ctx.storage.get(key) |
Saklanan değer veya null |
await ctx.storage.set(key, value) |
Herhangi bir JSON değerini kaydeder ve mevcut değeri üzerine yazar |
await ctx.storage.delete(key) |
Silinir; varsa true |
await ctx.storage.list({ prefix, limit, cursor }) |
Sayfa sayfa önemli isimler ve boyutlar |
export default async function transform(payload, ctx) {
const key = `seen:${payload.id}`
if (await ctx.storage.get(key)) return null
await ctx.storage.set(key, { at: Date.now() })
return payload
}Mağaza verileriyle zenginleştirme
ctx.shopify, mağazanız için salt okunur Admin GraphQL sorguları çalıştırır; bu nedenle bir iş akışı, gönderenin hiç sahip olmadığı verilerle başlayabilir. Yalnızca sizin izin verdiğiniz bilgileri görebilir: “Function” sekmesindeki Mağaza veri erişimi altında ihtiyacınız olan erişim kapsamlarını verin. Varsayılan olarak hiçbir erişim izni verilmez ve mutasyonlar reddedilir.
export default async function transform(payload, ctx) {
const data = await ctx.shopify(
`query($q: String!) {
productVariants(first: 1, query: $q) { nodes { id title price } }
}`,
{ q: `sku:${payload.sku}` },
)
const variant = data.productVariants.nodes[0]
if (!variant) return null
return { sku: payload.sku, variantId: variant.id, price: variant.price }
}Aramayı kendiniz cevaplamak
ctx.respond(), anında bir yanıt gönderir; bu da webhook’u küçük bir API uç noktası haline getirir: bir şeyi doğrulayın, bir yanıt hesaplayın ve tek bir istekle yanıt verin. Shopify Flow, döndürdüğünüz değer ne olursa olsun çalışmaya devam eder.
export default async function transform(payload, ctx) {
const ok = typeof payload.email === "string" && payload.email.includes("@")
ctx.respond({ accepted: ok }, { status: ok ? 200 : 422 })
return ok ? payload : null
}Testler
“İşlev” sekmesindeki Test paneli, kaydedilmemiş değişiklikler de dahil olmak üzere düzenleyicideki kodu örnek bir yük üzerinde çalıştırır. Bu panelde dönüş değeri, işlevinizin göndereceği yanıt, oluşturduğu Shopify Flow alanları, günlük satırlarınız ve işlem süresi gösterilir. Shopify Flow tetiklenmez, Geçmiş'e hiçbir şey kaydedilmez ve planınızın kotasından hiçbir şey düşülmez. Ancak depolama çağrıları gerçektir: bir test çalıştırması, canlı isteklerde olduğu gibi aynı mağazayı okur ve yazar.
Bir işlev başarısız olduğunda
Kodunuz bir istisna atarsa, zaman aşımına uğrarsa veya kullanılamaz bir değer döndürürse, istek 422 koduyla reddedilir ve hata, hata mesajı ve günlük satırlarınızla birlikte Geçmiş’e kaydedilir; böylece ne olduğunu görebilirsiniz. Kodu düzeltin ve o girişi yeniden çalıştırın: Yeniden çalıştırma işlemi yeni sürümü çalıştırır.
Sınırlar
- Her çalıştırmada 5 saniye ve 64 MB, ayrıca 50.000 karakterlik kod.
- npm paketi yok. Tek çözüm
ctx.fetch’dir ve dahili veya özel adresler kabul edilmez. ctx.shopify, her çalıştırmada 10 çağrıya izin verir; yalnızca sorgular yapılabilir ve bu, sizin verdiğiniz erişim izinleriyle sınırlıdır.- Shopify Flow’a ulaşan her çalıştırma, normal bir çağrı olarak kabul edilir ve planınızın kotasına dahil edilir. Atlanan bir istek ise dahil edilmez.
