Google Cloud Pub / Sub - Cloud Function & Bigquery - вставка данных не происходит - PullRequest
0 голосов
/ 28 марта 2019

Я использую функцию Google Cloud Platform, которая прослушивает Pub / SubTopic и вставляет данные в BigQuery.

Входные данные, которые я передаю из консоли pub / sub, представлены в формате JSON {"NAME"," ABCD "}, но из журнала консоли я мог видеть, что сообщение приходит как {NAME, ABCD}, и во время выполнения это также ошибка.2 распространенные ошибки, с которыми я столкнулся

  1. SyntaxError: Неожиданный токен n в JSON в позиции 1 в Object.parse (native) at exports.helloPubSub "

  2. "ОШИБКА: {Ошибка: недопустимое значение в 'row [0] .json'"

Введено:

gcloud pubsub topics publish pubsubtopic1 --message {"name":"ABCD"}

Опробованы различные форматы входных данных с одинарными кавычками и квадратными скобками, а также с другими возможными параметрами. Ничего не помогаеткоторый упоминался выше, но заканчивается row[0] issue

Когда я передаю входные данные JSON в виде жестко закодированных значений внутри облачной функции, такой как {"NAME", "ABCD"}, данные вставляются правильно.

/**This is working code since i hardcoded the data in JSON format, commented the lines which i tried and did not helped**/

/**
 * Triggered from a message on a Cloud Pub/Sub topic.
 *
 * @param {!Object} event Event payload and metadata.
 * @param {!Function} callback Callback function to signal completion.
 */
exports.helloPubSub = (event, callback) => {
  const pubsubMessage = event.data;
  console.log(Buffer.from(pubsubMessage.data, 'base64').toString());
  const {BigQuery} = require('@google-cloud/bigquery');
  const bigquery = new BigQuery();
  //console.log(Buffer.from(pubsubMessage.data, 'base64').toString());
  //console.log(JSON.parse(Buffer.from(pubsubMessage.data, 'base64').toString()));
  var myjson='{"NAME":"ABCD","STATE":"HHHH","AGE":"12"}';
  console.log(myjson);
   bigquery
    .dataset("DEMO")
    .table("EMP")
    .insert(JSON.parse(myjson),
    {'ignoreUnknownValues':true, 'raw':false})
  //.insert(JSON.parse(Buffer.from(pubsubMessage.data, 'base64').toString()), 
    .then ((data) => {
      console.log('Inserted 1 rows');
      console.log(data);
    })
    .catch(err => {
      if (err && err.name === 'PartialFailureError') {
        if (err.errors && err.errors.length > 0) {
          console.log('Insert errors:');
          err.errors.forEach(err => console.error(err));
        }
      } else {
        console.error('ERROR`enter code here`:', err);
      }
    });
  };

1 Ответ

1 голос
/ 28 марта 2019

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

Используя указанный выше синтаксис, я получаю следующий результат:

gcloud pubsub topics publish pubsubtopic1 --message {"name":"ABCD"}
gcloud pubsub subscriptions pull pubsubsubscription1

Результат:

ДАННЫЕ name {имя: ABCD}

Если вы используете этот синтаксис вместо:

gcloud pubsub topics publish pubsubtopic1 --message "{\"name\":\"ABCD\"}"
gcloud pubsub subscriptions pull pubsubsubscription1

Результат:

ДАННЫЕ |{"name": "ABCD"}

РЕДАКТИРОВАТЬ 2019-04-01

Обходное решение выше для целей тестирования, необходимость использования escape-символов является предостережением использованиякомандная строка.Для публикации из вашего реального приложения вы можете использовать вызов REST или клиентскую библиотеку, как указано здесь . Обратите внимание, что API Pub / Sub ожидает, что сообщение будет закодировано в base64.Например:

POST https://pubsub.googleapis.com/v1/projects/{YOUR_PROJECT_ID}/topics/{YOUR_TOPIC}:publish?key={YOUR_API_KEY}

{
 "messages": [
  {
   "data": "eyJuYW1lIjoiQUJDRCJ9"
  }
 ]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...