У меня есть веб-приложение с интеграцией платежной системы, и я столкнулся с проблемой, когда данные о платежах не обновляются на информационной панели в производственной среде, хотя в разработке они работают нормально.
см. диаграмму: 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 });
}
}
Я искал и обнаружил, что когда я перешел в «Кэш данных»> «Очистить кеш»> «Очистить все» и удалил его, данные в приложении обновляются и отображаются на информационной панели. Но это ненадолго. Другой способ: вы должны делать это для каждого обновления, которое происходит относительно базы данных.
Я изменил свой образ мышления, начав программировать функцию с нуля, находя допущенные мной ошибки и затем исправляя их.
Это новый код:
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 }
);
}
}
Как сейчас написано, ваш ответ неясен. Пожалуйста, отредактируйте , чтобы добавить дополнительную информацию, которая поможет другим понять, как это относится к заданному вопросу. Более подробную информацию о том, как писать хорошие ответы, вы можете найти в справочном центре.