Как установить install.private в хуках приложений Cloudflare? - PullRequest
1 голос
/ 20 марта 2020

Я пытаюсь хранить и извлекать личные данные в своих хуках, устанавливая install.private, как описано здесь , но последующие запросы хуков не включают в себя свойство install.private.

Использование Приведенное ниже приложение install.json и рабочий index.js, я тестирую это следующим образом:

  1. Я нажимаю Установить частное значение флажок
  2. Крюк отправляет "option-change:testSetPrivate" запрос на Worker
  3. Worker устанавливает install.private = { value: install.options.privateIn } в ответ
  4. Я нажимаю флажок Восстановить личное значение
  5. Hook send "option-change:testGetPrivate" запрос к работнику
  6. работник пытается получить доступ к install.private.value, но выдает исключение Cannot read property 'value' of undefined

Вот как выглядит итоговый пользовательский интерфейс:

app-creator-ui-screenshot

Установка приложения. json

{
  "$schema": "http://json.schemastore.org/install",
  "resources": {
    "head": [],
    "body": []
  },
  "dns": [],
  "preview": {
    "handlers": [
      {
        "options": ["_default"],
        "execute": "INSTALL_SCOPE.setOptions(INSTALL_OPTIONS)"
      }
    ]
  },
  "hooks": [
    {
      "endpoint": "...",
      "events": ["option-change:testSetPrivate"],
      "block": true,
      "failure": {
        "action": "failure",
        "message": "Something went wrong"
      }
    },
    {
      "endpoint": "...",
      "events": ["option-change:testGetPrivate"],
      "block": true,
      "failure": {
        "action": "failure",
        "message": "Something went wrong."
      }
    }
  ],
  "options": {
    "properties": {
      "privateIn": {
        "order": 1,
        "title": "The Private Value to Set",
        "type": "string",
        "default": "this is private"
      },
      "testSetPrivate": {
        "order": 2,
        "title": "Set the Private Value",
        "type": "boolean",
        "default": false
      },
      "testGetPrivate": {
        "order": 3,
        "title": "Retrieve the Private Value",
        "type": "boolean",
        "default": false
      },
      "privateOut": {
        "order": 4,
        "title": "The Private Value we Got",
        "type": "string"
      }
    }
  }
}

Рабочий индекс. js


addEventListener('fetch', event => {
  event.respondWith(handleRequest(event.request))
})

async function handleRequest (request) {
  const data = await request.json()
  let install = data.install
  let errors = []

  if (data.event === "option-change:testSetPrivate") {
    // Write privateIn to install.private
    install.private = {
      value: install.options.privateIn
    }
  } else if (data.event === "option-change:testGetPrivate") {
    // Read from install.private and write to install.options.privateOut
    try {
      install.options.privateOut = install.private.value
    } catch (e) {
      errors.push({type: "unknown", message: e.message})
    }
  } else {
    throw `Unhandled event: ${data.event}`
  }

  const responseData = {
    proceed: errors.length === 0,
    errors,
    install,
  }

  return new Response(JSON.stringify(responseData), {
    status: responseData.proceed ? 200 : 400,
    headers: { 'content-type': 'application/json' },
  })
}
...