'NodeJS GC function cannot be initialized

Trying out my first NodeJS cloud function so far unsuccessfully despite working fine VS code. Getting following error

Function cannot be initialized. Error: function terminated.

Looking through the logs I see some potential issues

Detailed stack trace: ReferenceError: supabase_public_url is not defined
Provided module can't be loaded (doesn't specify)

Thoughts: Am I doing it wrong with the secret manager and using the pub/sub incorrect?

My Code index.js

import { createClient } from '@supabase/supabase-js'
import sgMail from "@sendgrid/mail"
import { SecretManagerServiceClient } from '@google-cloud/secret-manager'

//activate cloud secret manager 
const client = new SecretManagerServiceClient()

const supabaseUrl = client.accessSecretVersion(supabase_public_url)
const supabaseKey = client.accessSecretVersion(supabase_service_key)
const sendgridKey = client.accessSecretVersion(sendgrid_service_key)


sgMail.setApiKey(sendgridKey)

const supabase = createClient(supabaseUrl, supabaseKey)

// get data for supabase where notifications coins are true
const supabaseNotifications = async() => {
    let { data, error } = await supabase
    .from('xxx')
    .select('*, xxx!inner(coin, xx, combo_change, combo_signal, combo_prev_signal), xxx!inner(email)')
    .eq('crypto_signals.combo_change', true)

    if(error) {
        console.error(error)
        return
    }
    return data
}

//create an array of user emails from supabase data
const userEmail = (data) => {
    try {
        const emailList = []
        for (let i of data) {
            if (emailList.includes(i.profiles.email) != true) {
                emailList.push(i.profiles.email)
            } else {}
        }
    return emailList

    }

    catch(e) {
        console.log(e)
    }
}

// function to take email list and supabase data to generate emails to users
const sendEmail = (e, data ) => {
  try {
    for (let i of e) {
        const signalList = []
        for (let x of data) {  
            if(i == x.profiles.email) {
                signalList.push(x)
            } else {}
        }

        
        // create msg and send from my email to the user 
        const msg = {
            to: i,
            from:"xxxx",
            subject: "Coin notification alert from CryptoOwl",
            text: "One or more of you coins have a new signal",
            html: signalList.toString()
        }
        sgMail.send(msg)
        console.log(i)
    }
  }
  catch(e) {
        console.log(e)
    }
}

// main function combines all 3 functions (supabase is await)
async function main(){
    let supabaseData = await supabaseNotifications();
    let supabaseEmails  = userEmail(supabaseData);
    let sendgridEmails = sendEmail(supabaseEmails, supabaseData);
}


exports.sendgridNotifications = (event, context) => {
  main()
};

my package.json with type module to use import above

{
  "type":"module",
  "dependencies":{
    "@sendgrid/mail":"^7.6.1",
    "@supabase/supabase-js":"1.30.0",
    "@google-cloud/secret-manager": "^3.11.0"
  }
}


Solution 1:[1]

I'm not at all versed in Google Secret Manager but a rapid look at the Node.js library documentation shows (if I'm not mistaking) that accessSecretVersion() is an asynchronous method.

As a matter of facts, we find in the doc examples like the following one:

async function accessSecretVersion() {
  const [version] = await client.accessSecretVersion({
    name: name,
  });

  // Extract the payload as a string.
  const payload = version.payload.data.toString();

  // WARNING: Do not print the secret in a production environment - this
  // snippet is showing how to access the secret material.
  console.info(`Payload: ${payload}`);
}

See https://cloud.google.com/secret-manager/docs/samples/secretmanager-access-secret-version#secretmanager_access_secret_version-nodejs

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Renaud Tarnec