https://soft-praline-633324.netlify.app
I have a big problem that I haven’t been able to solve for 2 days. To send push notifications to users on the site, I use firebase cloud messaging in nuxt 3. On localhost everything works fine, since it finds the json file for use by firebase-admin (I added json to both the project root and the public folder).
We are talking about GOOGLE_APPLICATION_CREDENTIALS and service-account-credentials.json.
Without adding this line to the .env file, push notifications are not sent, POST 500 errors are issued. I deploy the site to Netlify, and this file is located in the repository in two places.
I also added an environment variable to the site in the form GOOGLE_APPLICATION_CREDENTIALS = ./service-account-credentials.json (tried ./public/service-account-credentials.json, public/service-account-credentials.json, service-account-credentials .json) and always get the same error.
Failed to parse service account json file: Error: ENOENT: no such file or directory, open 'service-account-credentials.json'.
I am attaching some code that may help in investigating the problem.
messages.post.ts
import { initializeApp, deleteApp } from "firebase-admin/app";
import { getMessaging } from "firebase-admin/messaging";
import { PrismaClient } from "@prisma/client";
const prisma = new PrismaClient();
interface IRequestBody {
title: string;
message: string;
phoneNumber: string
}
export default defineEventHandler(async (event) => {
const { title, message, phoneNumber } = await readBody<IRequestBody>(event);
const app = initializeApp();
const messaging = getMessaging(app);
let tokensArray: string[] = []
try {
const clientDevices = await prisma.clientDevicesToken.findMany({
where: {
phoneNumber,
},
});
tokensArray = clientDevices.map(device => device.token);
} catch (error) {
if (error instanceof Error) {
return { error: error.message };
}
}
await messaging.sendEachForMulticast({
tokens: tokensArray,
notification: {
title: title,
body: message,
}
})
messaging.sendToTopic("topic", { notification: {} });
deleteApp(app);
});