Полезная нагрузка становится неопределенной, когда она достигает рабочего - PullRequest
0 голосов
/ 06 апреля 2019

Итак, я пытаюсь отправить задачу в очередь облачных задач Google, но когда она туда попадает, она становится неопределенной.Вот снимки моего кода.Что я делаю не так?

Я делаю это с помощью node.js и фреймворка Adonis.js.Полезная нагрузка состоит из объекта с пользовательской информацией.Что-то вроде: {first_name: 'Bla', last_name: 'Bla bla', email: 'bla@bla.com'} и так далее.Я выполнял задачи, которые действительно работают раньше, но я не могу найти ошибку в этом ... Итак, вот мои фрагменты кода:

Здесь я создаю задачу:

const payload = { users }
    const http = {
      method: 'PUT',
      endpoint: '/api/task/users',
      headers: {
        Authorization: request.header('Authorization')
      }
    }

    const task = new Task('users', http, payload)

    try {
      await task.createTask()
    } catch (e) {
      console.log(e)
      return response.status(500).send({ message: 'Users task: Internal Error!' })
    }

Это мой класс задач (я сделал это так же, как документация по облачным задачам):

constructor (queue, http, payload = undefined, seconds = undefined) {
    const project = Config.get('google.projectId')
    const location = Config.get('google.location')

    this._client = new cloudTasks.CloudTasksClient()
    console.log(project, location, queue)
    this._parent = this._client.queuePath(project, location, queue)
    this._payload = payload
    this._http = http
    this._seconds = seconds
  }

  async createTask() {
    const task = {
      appEngineHttpRequest: {
        httpMethod: this._http.method,
        relativeUri: this._http.endpoint,
        headers: this._http.headers
      },
    }

    if (this._payload !== undefined) {
      task.appEngineHttpRequest.body = Buffer.from(JSON.stringify(this._payload)).toString('base64')
    }

    if (this._seconds !== undefined) {
      task.scheduleTime = {
        seconds: this._seconds + Date.now() / 1000
      }
    }

    const request = {
      parent: this._parent,
      task: task
    }

    console.log(`Sending task: ${task}`)
    const [ res ] = await this._client.createTask(request)
    console.log(`Created task ${res.name}`)
  }

И это работник, который получит задачу:

async users ({ request, response, domain }) {
    const { users } = request.only(['users'])

    for (const user of users) {
      try {
        let u = await User.findOrCreate({ email: user.email }, user)
        if (u.id) {
          u.merge(user)
          await u.save()
        } else {
          await u.test().associate(test)
        }
      } catch (e) {
        console.log(e)
        return response.status(500).send(`User Task Error: ${e}`)
      }
    }

Я ожидал того же самого объекта, который описал, прежде чем добраться до работника, но я просто могу получить «неопределенное» значение.Ребята, вы можете мне помочь?Спасибо!: D

1 Ответ

1 голос
/ 17 июня 2019

Это может быть связано с разбором тела входящего запроса. По умолчанию заголовок Content-Type запроса Task имеет значение «application / octet-stream» (https://cloud.google.com/tasks/docs/reference/rest/v2beta3/projects.locations.queues.tasks#AppEngineHttpRequest).

Поэтому вам может потребоваться установить для вашего анализатора соответствующий тип синтаксического анализа (https://github.com/googleapis/nodejs-tasks/blob/master/samples/server.js#L27) или вручную установить Content-Type.

...