1
votes

"La fonction de rappel n'est pas une fonction" Erreur lors du suivi du didacticiel Google Cloud Scheduler / PubSub

J'essaie de créer une planification de démarrage / arrêt pour mon instance de VM sur Google Cloud. Je suis ce tutoriel créé par Google mais lorsque j'arrive à la section (Facultatif) Vérifiez que les fonctions fonctionnent et essayez de tester la fonction stopInstancePubSub et de transmettre les données {" ":" eyJ6b25lIjoidXMtd2VzdDEtYiIsICJsYWJlbCI6ImVudj1kZXYifQo = "} Objet JSON J'obtiens l'erreur suivante:

const Buffer = require('safe-buffer').Buffer;
const Compute = require('@google-cloud/compute');
const compute = new Compute();

/**
 * Stops a Compute Engine instance.
 *
 * Expects a PubSub message with JSON-formatted event data containing the
 * following attributes:
 *  zone - the GCP zone the instances are located in.
 *  instance - the name of a single instance.
 *  label - the label of instances to start.
 *
 * Exactly one of instance or label must be specified.
 *
 * @param {!object} event Cloud Function PubSub message event.
 * @param {!object} callback Cloud Function PubSub callback indicating completion.
 */
exports.stopInstancePubSub = (event, callback) => {
  try {
    const pubsubMessage = event.data;
    const payload = _validatePayload(
      JSON.parse(Buffer.from(pubsubMessage.data, 'base64').toString())
    );
    const options = {filter: `labels.${payload.label}`};
    compute.getVMs(options).then(vms => {
      vms[0].forEach(instance => {
        if (payload.zone === instance.zone.id) {
          compute
            .zone(payload.zone)
            .vm(instance.name)
            .stop()
            .then(data => {
              // Operation pending.
              const operation = data[0];
              return operation.promise();
            })
            .then(() => {
              // Operation complete. Instance successfully stopped.
              const message = 'Successfully stopped instance ' + instance.name;
              console.log(message);
              callback(null, message);
            })
            .catch(err => {
              console.log(err);
              callback(err);
            });
        }
      });
    });
  } catch (err) {
    console.log(err);
    callback(err);
  }
};

/**
 * Validates that a request payload contains the expected fields.
 *
 * @param {!object} payload the request payload to validate.
 * @return {!object} the payload object.
 */
function _validatePayload(payload) {
  if (!payload.zone) {
    throw new Error(`Attribute 'zone' missing from payload`);
  } else if (!payload.label) {
    throw new Error(`Attribute 'label' missing from payload`);
  }
  return payload;
}

Je ne sais pas ce que je fais de mal ici, je manque un autre argument à passer à la fonction?

* Edit: Le code utilisé est tiré du Tutoriel de Google:

2019-06-09 17:23:54.225 EDT
stopInstancePubSub
ipmdukx38xpw
TypeError: callback is not a function at exports.stopInstancePubSub (/srv/index.js:55:5) at /worker/worker.js:825:24 at <anonymous> at process._tickDomainCallback (internal/process/next_tick.js:229:7)


4 commentaires

Veuillez fournir le code pour examen.


Votre JSON va bien. Vous devrez publier le code.


S'il vous plaît voir la modification, le code est le même que celui du tutoriel lié ci-dessus. @JohnHanley


Lors du débogage, vous avez un message d'erreur. Maintenant, mappez ce message d'erreur au fichier et à la ligne de votre question. Cela nous aidera à comprendre le problème. Remarque: faire des hypothèses est à l'origine de nombreux bogues. Par conséquent, lors de la publication d'une question, nous n'assumerons rien. Nous avons besoin de tous les détails.


3 Réponses :


3
votes

J'ai rencontré le même problème il y a à peine une heure :)

Essayez de prendre callback comme troisième paramètre:

exports.stopInstancePubSub = (événement, données, rappel) => {...}

J'espère que cela aide


1 commentaires

Est-ce que cela doit être avec une fonction Cloud Storage ou PubSub, ou cela peut-il être avec Firestore? La documentation indique "... en réponse à un événement, tel qu'un message sur un sujet Cloud Pub / Sub, une modification dans un bucket Cloud Storage ou un événement Firebase". Mais j'obtiens le "rappel n'est pas une erreur" lors du déclenchement à partir d'un événement Firestore. cloud.google.com/functions/docs/writing/…



1
votes

Essayez exports.stopInstancePubSub = (event, context, callback) => {...}

Le référentiel source a été mis à jour < / a>.


0 commentaires

0
votes

Le problème est la version d'exécution.

Essayez d'utiliser: RuntimeNode.js 6 (obsolète)

Cette solution a été résolue pour moi


0 commentaires