Как правильно опубликовать sh в GCP PubSub из облачной функции? - PullRequest
0 голосов
/ 15 января 2020

Я пытаюсь опубликовать sh сообщение для GCP PubSub при написании документа в Firestore.

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

Я использую документацию здесь . publi sh указан как устаревший и указывает на publishMessage в качестве замены.

Ошибка, которую я получаю при использовании функции publishMessage: «TypeError: Данные должны быть в виде буфера. '

Есть идеи о том, что мне не хватает с синтаксисом publishMessage ?

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();
const firestore = admin.firestore();
const {PubSub} = require('@google-cloud/pubsub');
const pubsub = new PubSub(MY_PROJECT);

exports.pubSubPublishTest = functions.firestore.document('pubSubTest/{docID}').onWrite((change, context) => {
  const topic = pubsub.topic('test');
  const otherBuffer = Buffer.from('this is the message');

  const callback = (err, messageId) => {
    if (err) {
      console.error(`error encountered during publish - ${err}`);
    } else {
      console.log(`Message ${messageId} published.`);
    }
  };

  // this worked, but the function is listed as deprecated
  topic.publish(otherBuffer, callback);

  // this did not work - {otherBuffer} is from  the doc
  // but I also tried without the curly braces and received the same error.
  //topic.publishMessage({otherBuffer}, callback);

  return null;
});

1 Ответ

1 голос
/ 15 января 2020

В документации API, на которую вы ссылаетесь, предлагается указать в качестве первого параметра объект MessageOptions . Согласно документации API для этого объекта, вы должны составить объект, который содержит одну из опций для определения полезной нагрузки. Если у вас есть узел Buffer, вы должны составить объект следующим образом:

topic.publishMessage({data: otherBuffer}, callback);

Этот метод является асинхронным и возвращает обещание, указывающее, когда сообщение отправлено.

Помните также, что вам необходимо вернуть обещание из вашей функции, которое разрешается только после завершения всей асинхронной работы c. Возвращение нуля, как вы сейчас, не будет работать. Вы должны использовать обещание, возвращаемое publishMessage (), чтобы сообщить облачным функциям, что ваша работа завершена и ее можно очистить.

return topic.publishMessage(...);

Я предлагаю также рассмотреть возможность использования этого обещания вместо функции обратного вызова, чтобы продолжить с дополнительной работой (например, вашей регистрации). Обучение эффективному обращению с обещаниями абсолютно необходимо для написания эффективных JavaScript в среде облачных функций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...