<पी> ली के ब्लॉग से प्रेरित होकर, जहां प्रत्येक ब्लॉग पोस्ट उसे देखे जाने की संख्या दिखाता है, मैं अपने पेज के लिए भी कुछ ऐसा ही करना चाहता था। मैं नए ऐप राउटर के साथ Next.js 13 का भी उपयोग कर रहा हूं, लेकिन पेज व्यू को MySQL डेटाबेस में संग्रहीत करने के बजाय, मैं अपस्टैश रेडिस का उपयोग करूंगा। <पी> यहां एक उदाहरण दिया गया है कि हम क्या बना रहे हैं। होम पेज पर प्रत्येक कार्ड उसे देखे जाने की संख्या दिखाएगा। <पी>
रेडिस क्यों?
<पी> रेडिस पहले से ही 2 बेहतरीन कमांड के साथ आता है जो डुप्लिकेट को हटाना और काउंटर को बढ़ाना आसान बनाता है। <पी> अधिक सटीक काउंटर पाने के लिए, मैं काउंटर की वृद्धि की आलोचना करना चाहता हूं। यदि कोई उपयोगकर्ता पृष्ठ को ताज़ा करता है, तो काउंटर को केवल एक बार बढ़ाया जाना चाहिए। हम इसे Redis' SET के साथ वास्तव में आसानी से कर सकते हैं आदेश. इसमें NX है विकल्प जो केवल कुंजी सेट करेगा यदि वह अभी तक मौजूद नहीं है और एक EX विकल्प जो एक निश्चित सेकंड के बाद कुंजी को समाप्त कर देगा। इन दोनों विकल्पों को मिलाकर हम यह सुनिश्चित कर सकते हैं कि एक एकल उपयोगकर्ता किसी दिए गए समय सीमा के भीतर काउंटर मल्टीपल बार वृद्धि न करे। <पी> दूसरा कमांड INCR है जो किसी दी गई कुंजी को परमाणु रूप से 1 बढ़ा देगा। रेडिस की स्थापना
<पी> अपस्टैश पर डेटाबेस स्थापित करना आसान है और इसमें प्रतिदिन 10 हजार अनुरोध निःशुल्क शामिल हैं! आप यहां एक नया डेटाबेस बना सकते हैं। इसमें वस्तुतः केवल कुछ ही सेकंड लगते हैं। बाद में नीचे स्क्रॉल करें और REST को कॉपी करें आपके .env.local के कनेक्शन रहस्य फ़ाइल: .env.localUPSTASH_REDIS_REST_URL=
UPSTASH_REDIS_REST_TOKEN=
Next.js
<पी> अब जब हमारे पास रेडिस डेटाबेस है, तो हम काउंटर को लागू करना शुरू कर सकते हैं। हमें पहले @upstash/redis इंस्टॉल करना होगा: pnpm add @upstash/redis
<पी> पृष्ठ दृश्यों को संग्रहीत करने के लिए, हमें दो घटकों की आवश्यकता है। एक एपीआई मार्ग और एक क्लाइंट घटक। आइए एपीआई रूट से शुरुआत करें। /api/incr.ts
<पी> अपस्टैश और @upstash/redis वर्सेल के एज फ़ंक्शंस के साथ संगत है, इसलिए सबसे पहले, हम अपनी ज़रूरत की हर चीज़ आयात करेंगे, रेडिस सेटअप करेंगे और रनटाइम को edge पर कॉन्फ़िगर करेंगे। . <पी> एक नई फ़ाइल /api/incr.ts बनाएं और निम्नलिखित कोड जोड़ें: /api/incr.tsimport { NextRequest, NextResponse } from "next/server";
import { Redis } from "@upstash/redis";
const redis = Redis.fromEnv();
export const config = {
runtime: "edge",
};
<पी> आगे हमें रिक्वेस्टबॉडी में पारित करने के लिए एक स्लग या समान पहचानकर्ता की आवश्यकता होगी। यदि यह मौजूद नहीं है, तो हम 400 लौटा देंगे स्थिति कोड. /api/incr.tsexport default async function incr(req: NextRequest): Promise<NextResponse> {
const body = await req.json();
const slug = body.slug as string | undefined;
if (!slug) {
return new NextResponse("Slug not found", { status: 400 });
}
// more to come here
}
<पी> फिर हमें उपयोगकर्ता का आईपी पता भी प्राप्त करना होगा। हम req.ip का उपयोग करके ऐसा कर सकते हैं संपत्ति. हम SHA-256 का उपयोग करके आईपी पते को हैश करेंगे एल्गोरिदम और इसे डेटाबेस में संग्रहीत करें। इस तरह हमें आईपी एड्रेस को सीधे स्टोर नहीं करना पड़ेगा, जो एक सुरक्षा चिंता का विषय हो सकता है। /api/incr.tsconst ip = req.ip;
// Hash the IP and turn it into a hex string
const buf = await crypto.subtle.digest("SHA-256", new TextEncoder().encode(ip));
const hash = Array.from(new Uint8Array(buf))
.map((b) => b.toString(16).padStart(2, "0"))
.join("");
<पी> अब ऊपर उल्लिखित पहले रेडिस कमांड का उपयोग करते हैं। SET का उपयोग करना NX के साथ और EX यह हमें यह जांचने का एक आसान तरीका देता है कि कोई विशिष्ट आईपी पता पिछले 24 घंटों के भीतर किसी पृष्ठ को देख रहा है या नहीं: /api/incr.tsconst isNew = await redis.set(["deduplicate", hash, slug].join(":"), true, {
nx: true,
ex: 24 * 60 * 60,
});
if (!isNew) {
new NextResponse(null, { status: 202 });
}
<पी> आखिरी काम यह है कि दिए गए स्लग के लिए काउंटर को बढ़ाया जाए। हम INCR का उपयोग करेंगे इसके लिए आदेश: /api/incr.tsawait redis.incr(["pageviews", "projects", slug].join(":"));
return new NextResponse(null, { status: 202 });
<पी> संदर्भ के लिए, आप पूरा कोड यहां पा सकते हैं /app/[slug]/view.tsx
<पी> इसके बाद, आइए एक छोटा क्लाइंट घटक बनाएं, जो माउंट होने पर हमारे द्वारा अभी बनाए गए एपीआई रूट पर एक अनुरोध भेजता है। इस घटक को किसी भी पेज में एम्बेड किया जा सकता है जिसे हम ट्रैक करना चाहते हैं। /app/[slug]/view.tsx"use client";
import { useEffect } from "react";
export const ReportView: React.FC<{ slug: string }> = ({ slug }) => {
useEffect(() => {
fetch("/api/incr", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({ slug }),
});
}, [slug]);
return null;
};
/app/[slug]/page.tsx
<पी> आखिरी चीज़ जो हमें करने की ज़रूरत है वह है ReportView जोड़ना उस पृष्ठ का घटक जिसे हम ट्रैक करना चाहते हैं: /app/[slug]/page.tsximport { ReportView } from "./view";
type Props = {
params: {
slug: string;
};
};
export default function Page({ params }: Props) {
return (
<div>
<ReportView slug={params.slug} />
{/* Add your page content here */}
</div>
);
}
<पी> अब से /app/[slug] की सभी विज़िटें ट्रैक किया जाएगा और पिछले 24 घंटों में प्रत्येक अद्वितीय आगंतुक के लिए काउंटर बढ़ाया जाएगा। दृश्य प्रदर्शित करना
<पी> दृश्यों को ट्रैक करना अच्छा है, लेकिन हम उन्हें सार्वजनिक रूप से प्रदर्शित भी करना चाहते हैं। आइए देखें कि हम यह कैसे कर सकते हैं। <पी> दृश्यों की संख्या प्रदर्शित करने के लिए, हमें उन्हें डेटाबेस से देखना होगा। हम GET का उपयोग करके ऐसा कर सकते हैं आदेश. हमें एक revalidate भी जोड़ना चाहिए पृष्ठ घटक में कॉन्फ़िगर करें, ताकि पृष्ठ हर 60 सेकंड में पुनः मान्य हो, न कि हर अनुरोध के लिए। /app/[slug]/page.tsxtype Props = {
params: {
slug: string;
};
};
export const revalidate = 60
export default function Page({ params }: Props) {
const views = await redis.get<number>(["pageviews", "projects", params.slug].join(":")) ?? 0
return ...
}
अंतिम शब्द
<पी> इसका पूरा उदाहरण chronark.com पर देखें। कोड GitHub पर उपलब्ध है। विशेष रूप से, यहां प्रासंगिक बिट्स हैं: - एपीआई मार्ग
- ट्रैकिंग घटक
- दृश्यों की संख्या लोड हो रही है
<पी> यदि आप अधिक पृष्ठ दृश्य विश्लेषण में रुचि रखते हैं, तो कृपया हमें ट्विटर या डिस्कॉर्ड पर बताएं।