Данные не обновляются на информационной панели в производственной среде

У меня есть веб-приложение с интеграцией платежной системы, и я столкнулся с проблемой, когда данные о платежах не обновляются на информационной панели в производственной среде, хотя в разработке они работают нормально.

см. диаграмму: https://excalidraw.com/#json=uwcITb3OzG_H2KBvCcWSJ,-Epm-_UIdZgrTsVRfJQ2nA

если вы не хотите видеть диаграмму:

Клиент:

PayPage: управляет процессом оплаты. Панель мониторинга: отображает данные платежа, включая статус, экзамен, полное имя и адрес электронной почты. Сервер:

Webhook: получает платежные данные от поставщика платежей. API: извлекает данные о платеже из базы данных. База данных:

Хранит данные о платежах.

Поток:

PayPage: Пользователь завершает платеж. Вебхук: получает данные о платежах и обновляет базу данных. Панель инструментов: извлекает данные о платежах из API и отображает их.

Проблема:

Разработка: Данные сохраняются в базе данных и корректно обновляются на информационной панели.

Протестируйте Postman в режиме разработки

Производство: Данные сохраняются в базе данных, но не обновляются на панели мониторинга.

Тестируйте Postman в производственном режиме


import { getUsersPaymentsData } from "./FetchUsersPaymentsData";
import { currentUser } from "@clerk/nextjs/server";

export default async function UsersInfo() {
  try {
    // get data of user
    const data = await getUsersPaymentsData();

    // get data of this current user from clerk
    const user = await currentUser();

    if (!user) {
      return (
        <div className = "border-t-2 sm:border-t-0 sm:border-l-2 border-accent pt-4 sm:pt-0 sm:pl-4">
          <p className = "text-navy-900">Status: User not found</p>
          <p className = "text-navy-900">Exam: N/A</p>
          <p className = "text-navy-900">FullName: N/A</p>
          <p className = "text-navy-900">Email: N/A</p>
        </div>
      );
    }

    // get specific data from clerk
    const serializedUser = {
      id: user.id,
      fullName: user.fullName,
      primaryEmailAddress: user.primaryEmailAddress?.emailAddress,
    };

    // check if the current user have data on db by userid
    const userStatusPayments = data.payments.find(
      (payment) => payment.clerkUser?.userID === serializedUser.id
    );

    // console.info(userStatusPayments.id);

    // if user not found at db return this
    if (!userStatusPayments) {
      return (
        <div className = "border-t-2 sm:border-t-0 sm:border-l-2 border-accent pt-4 sm:pt-0 sm:pl-4">
          <p className = "text-navy-900">Status: FREE</p>
          <p className = "text-navy-900">Exam: No Specified</p>
          <p className = "text-navy-900">FullName: {serializedUser.fullName}</p>
          <p className = "text-navy-900">
            Email: {serializedUser.primaryEmailAddress}
          </p>
        </div>
      );
    }

    // if everything is good and the user is found return his data and show it
    return (
      <div className = "border-t-2 sm:border-t-0 sm:border-l-2 border-accent pt-4 sm:pt-0 sm:pl-4">
        <p className = "text-navy-900">
          Status: {userStatusPayments.lemonsqueezyUser.paymentsInfo.status}
        </p>
        <p className = "text-navy-900">Exam: {userStatusPayments.examName}</p>
        <p className = "text-navy-900">
          FullName: {userStatusPayments.clerkUser.userFullName}
        </p>
        <p className = "text-navy-900">
          Email: {userStatusPayments.clerkUser.userEmail}
        </p>
      </div>
    );

  // that for catch error and return it
  } catch (error) {
    console.info("Error loading user payment info: ", error);
    return (
      <div className = "border-t-2 sm:border-t-0 sm:border-l-2 border-accent pt-4 sm:pt-0 sm:pl-4">
        <p className = "text-navy-900">Status: Error loading data</p>
      </div>
    );
  }
}


import config from "@/config";

export const getUsersPaymentsData = async () => {
  try {
    const res = await fetch(`${config.domainNameProduction}/api/payments`, {
      cache: "no-store",
    });

    if (!res.ok) {
      throw new Error("Failed to fetch topics");
    }

    return res.json();
  } catch (error) {
    console.info("Error loading topics: ", error);
  }
};


это API/платежи/route.js


import clientPromise from "@/utils/mongodb";
import { NextResponse } from "next/server";

export async function GET() {
  try {
    const client = await clientPromise;
    const db = client.db(process.env.MONGODB_DB);

    const payments = await db.collection("payments").find({}).toArray();

    return NextResponse.json({ payments }, { status: 200 });
  } catch (error) {
    console.info(error);
    return NextResponse.json({ message: "Error", error }, { status: 500 });
  }
}

Я искал и обнаружил, что когда я перешел в «Кэш данных»> «Очистить кеш»> «Очистить все» и удалил его, данные в приложении обновляются и отображаются на информационной панели. Но это ненадолго. Другой способ: вы должны делать это для каждого обновления, которое происходит относительно базы данных.

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
0
0
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Это новый код:

import { getUsersPaymentsData } from "./FetchUsersPaymentsData";
import { currentUser } from "@clerk/nextjs/server";

export default async function UsersInfo({ params }) {
  const { id } = params;
  // console.info("Received ID: ", id); // Output: it's working, ID is received

  const ClerkUser = await currentUser();

  const serializedUser = {
    id: ClerkUser.id,
    fullName: ClerkUser.fullName,
    primaryEmailAddress: ClerkUser.primaryEmailAddress?.emailAddress,
  };

  const userData = await getUsersPaymentsData(id);
  // console.info("Fetched User Data:", userData); // Output: undefined or actual data

  if (!userData || !userData.foundPayments) {
    return (
      <div className = "border-t-2 sm:border-t-0 sm:border-l-2 border-accent pt-4 sm:pt-0 sm:pl-4">
        <p className = "text-navy-900">Status: FREE</p>
        <p className = "text-navy-900">Exam: No Specified</p>
        <p className = "text-navy-900">FullName: {serializedUser.fullName}</p>
        <p className = "text-navy-900">Email: {serializedUser.primaryEmailAddress}</p>
      </div>
    );
  }

  const user = userData.foundPayments;
  // console.info("Found Payments: ", user); // For debugging

  return (
    <div className = "border-t-2 sm:border-t-0 sm:border-l-2 border-accent pt-4 sm:pt-0 sm:pl-4">
      <p className = "text-navy-900">
        Status: {user.lemonsqueezyUser.paymentsInfo.status}
      </p>
      <p className = "text-navy-900">Exam: {user.examName}</p>
      <p className = "text-navy-900">FullName: {user.clerkUser.userFullName}</p>
      <p className = "text-navy-900">
        Email: {user.lemonsqueezyUser.customerEmail}
      </p>
    </div>
  );
}
import config from "@/config";

export async function getUsersPaymentsData(id) {
  try {
    const res = await fetch(
      `${config.domainNameProduction}/en/api/payments/${id}`,
      {
        cache: "no-store",
      }
    );

    if (!res.ok) {
      throw new Error("Failed to fetch payments data");
    }

    const data = await res.json(); // Await the response
    return data;
  } catch (error) {
    console.error("Error fetching payment data:", error); // Improved error logging
    return null; // Return null in case of error
  }
}

внутри моего API

// API/платежи/route.js

import Payments from "@/models/Payments";
import { NextResponse } from "next/server";

export async function GET() {
  try {
    const payments = await Payments.find();
    return NextResponse.json({ payments }, { status: 200 });
  } catch (error) {
    console.info(error);
    return NextResponse.json({ message: "Error", error }, { status: 500 });
  }
}

// API/платежи/[id]/route.js

// import Payments from "@/models/Payments";
import { NextResponse } from "next/server";
import clientPromise from "@/utils/mongodb";

export async function GET(req, { params }) {
  const { id } = params;

  try {
    const client = await clientPromise; // Ensure MongoDB connection is established
    const db = client.db();

    const foundPayments = await db.collection('payments').findOne({ "clerkUser.userID": id });

    if (!foundPayments) {
      return NextResponse.json(
        { message: "Error: Payments Information Not Found" },
        { status: 404 }
      );
    }

    return NextResponse.json({ foundPayments }, { status: 200 });
  } catch (error) {
    console.error("Error fetching payment data:", error); // Improved error logging
    return NextResponse.json(
      { message: "Server Error", error: error.message },
      { status: 500 }
    );
  }
}

Другие вопросы по теме