Dönüşüm fonksiyonları

Dönüşüm fonksiyonları

Sayfayı kopyala

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

The contractjavascript
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.

Flatten and normalisejavascript
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.

Only paid orders above 100javascript
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
Skip events you have already seenjavascript
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.

Look up a variant by SKUjavascript
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.

Reply to the caller and start a workflowjavascript
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.