firebase/functions-samples

[BUG] in sample: quickstarts/taskqueues-backup-images/functions/index.js

ddave09 opened this issue · 1 comments

Which sample has a bug?

quickstarts/taskqueues-backup-images/functions/index.js

I have created my own queue with minor modifications provided in the Failing Function code used section. If someone can please help resolve the issue, I would really appreciate it.

Sample name or URL where you found the bug
quickstarts/taskqueues-backup-images/functions/index.js

How to reproduce the issue

  • create an index.ts file for functions with the below-mentioend code.
  • Deploy executeOrders function to create the queue with the same name.
  • execute submitOrder function.
  • enqueue fails with message: Unhandled error FirebaseFunctionsError: Queue does not exist.

Failing Function code used (if you modified the sample)

import * as functions from "firebase-functions";
import * as firebaseAdmin from "firebase-admin";
import * as firebaseFunctions from "firebase-admin/functions";
import * as serviceAccount from "../serviceAccount.json";

firebaseAdmin.initializeApp({
  credential: firebaseAdmin.credential.cert({
    projectId: serviceAccount.project_id,
    clientEmail: serviceAccount.client_email,
    privateKey: serviceAccount.private_key,
  }),
});

export const executeOrders = functions.region(
    region,
).tasks.taskQueue({
  retryConfig: {
    maxAttempts: 2,
    minBackoffSeconds: 10,
  },
  rateLimits: {
    maxConcurrentDispatches: 1,
  },
}).onDispatch(async (data) => {
  functions.logger.info(data);
});

export const submitOrder = functions.region(
    region,
).https.onCall(async (data, context) => {
  const queue = firebaseFunctions.getFunctions().taskQueue("executeOrders");

  functions.logger.info(data);

  await queue.enqueue({"orderId": 1});
});

I also have tried to pass in the app object returned from firebaseAdmin.initializeApp to firebaseFunctions.getFunctions() as below, but still the same behavior.

const firebaseAdminApp  = firebaseAdmin.initializeApp({
  credential: firebaseAdmin.credential.cert({
    projectId: serviceAccount.project_id,
    clientEmail: serviceAccount.client_email,
    privateKey: serviceAccount.private_key,
  }),
});

export const submitOrder = functions.region(
    region,
).https.onCall(async (data, context) => {
  const queue = firebaseFunctions.getFunctions(firebaseAdminApp).taskQueue("executeOrders");

  functions.logger.info(data);

  await queue.enqueue({"orderId": 1});
});

Steps to set up and reproduce

  • Env: node@16
  • Typescript
  • Deploy queue executeOrders
  • Start function emulator or without emulator (I have tried both ways but I get the same behavior.)
  • From any client call submitOrder function to enqueue a task in the executeOrders queue.
  • Function throws an error when enqueuing the task: Unhandled error FirebaseFunctionsError: Queue does not exist. even when the queue exists.

Debug output

{"severity":"ERROR","message":"Unhandled error FirebaseFunctionsError: Queue does not exist.\n    at FirebaseFunctionsError.FirebaseError [as constructor] (/Users/darshitdave/Documents/Workspace/youvest/youvest/functions/node_modules/firebase-admin/lib/utils/error.js:44:28)\n    at FirebaseFunctionsError.PrefixedFirebaseError [as constructor] (/Users/darshitdave/Documents/Workspace/youvest/youvest/functions/node_modules/firebase-admin/lib/utils/error.js:90:28)\n    at new FirebaseFunctionsError (/Users/darshitdave/Documents/Workspace/youvest/youvest/functions/node_modules/firebase-admin/lib/functions/functions-api-client-internal.js:269:28)\n    at FunctionsApiClient.toFirebaseError (/Users/darshitdave/Documents/Workspace/youvest/youvest/functions/node_modules/firebase-admin/lib/functions/functions-api-client-internal.js:243:16)\n    at /Users/darshitdave/Documents/Workspace/youvest/youvest/functions/node_modules/firebase-admin/lib/functions/functions-api-client-internal.js:101:25\n    at processTicksAndRejections (node:internal/process/task_queues:96:5)\n    at async /Users/darshitdave/Documents/Workspace/youvest/youvest/functions/lib/src/index.js:182:5\n    at async /Users/darshitdave/Documents/Workspace/youvest/youvest/functions/node_modules/firebase-functions/lib/common/providers/https.js:407:26\n    at async runFunction (/usr/local/lib/node_modules/firebase-tools/lib/emulator/functionsEmulatorRuntime.js:564:9)\n    at async runHTTPS (/usr/local/lib/node_modules/firebase-tools/lib/emulator/functionsEmulatorRuntime.js:590:5) {\n  errorInfo: {\n    code: 'functions/failed-precondition',\n    message: 'Queue does not exist.'\n  },\n  codePrefix: 'functions'\n}"}

Screenshots

Expected behavior

The task should be enqueued under executeOrders queue.

Actual behavior

Error message: Unhandled error FirebaseFunctionsError: Queue does not exist. even when the queue executeOrders exists.

For me I can get around the error with specifying the location of the queue by replacing
.taskQueue("executeOrders");
with
.taskQueue("location/us-east1/functions/executeOrders");

Unfortunately with this working I get the error Request is missing body.

I got it to work the same way as described here by creating a separate onRequest function
#1105