استفاده از Turso DB با NextJS

Turso پایگاه داده جدیدی است که به شما امکان می دهد پایگاه داده خود را به راحتی در لبه مستقر کنید. این مشکل هممکانی را با تکرار پایگاه داده در مناطق مختلف حل میکند و کپیها همیشه با یک اصلی همگام هستند. Turso بر روی libSQL ساخته شده است، یک منبع باز و مشارکت باز SQLite.
ما یک برنامه محبوب مقصد گردشگری خواهیم ساخت که لیستی از مقاصد گردشگری محبوب را نشان می دهد. لینک زنده را بررسی کنید و کد منبع در اینجا موجود است.
استفاده از Turso با NextJS بسیار آسان است، همانطور که می توانید از هر پایگاه داده دیگری استفاده کنید. ابتدا باید Turso CLI را نصب کنیم. میتوانید دستورالعملهای نصب CLI را از مستندات اینجا دنبال کنید. پس از آن، ما یک پروژه جدید nextJS را شروع خواهیم کرد. من ترجیح می دهم برنامه بعدی خود را با استفاده از دستور Create-T3-App شروع کنم، اما همچنان می توانید از دستور نصب رسمی nextJS استفاده کنید. تایپ اسکریپت را به عنوان زبان انتخابی انتخاب کنید و وقتی از Tailwind خواسته شد، بله را بزنید، چرا که نه.
npm create t3-app@latest
پس از نصب Turso CLI، باید لاگین کنیم. Turso یک پنجره مرورگر جدید باز می کند که در آن باید به برنامه Github Turso مجوزهایی برای حساب خود بدهید.
turso auth signup
پس از تکمیل فرآیند ورود، CLI یک نشانه دریافت می کند که شما را شناسایی می کند و آن را در یک فایل محلی ذخیره می کند. در macOS، فایل در قرار دارد $HOME/Library/Application
پشتیبانی/تورسو. در لینوکس، این است $HOME/.config/turso
. نکاتی که باید در مورد این توکن توجه کنید:
-
این نشانه را با کسی که کاملاً به او اعتماد ندارید به اشتراک نگذارید. آنها می توانند از آن برای کار با Turso از طرف شما استفاده کنند.
-
این توکن همراه با تمام درخواستهای API پشتیبان که توسط CLI هنگام ورود به سیستم ارسال میشود، ارسال میشود.
-
با استفاده از دستور می توانید آن را چاپ کنید.
turso auth token
. -
بعد از 7 روز منقضی می شود. پس از آن باید دوباره با ورود به سیستم turso auth وارد شوید.
پس از بخش auth، نوبت به ایجاد پایگاه داده و seed برخی از داده ها در آن می رسد. می توانید پایگاه داده را با استفاده از دستور turso db create ایجاد کنید.
turso db create [DATABASE-NAME]
این یک پایگاه داده جدید ایجاد می کند که از نظر جغرافیایی به شما نزدیک تر است. سپس از طریق دستور shell با استفاده از این دستور شروع به تعامل با پایگاه داده کنید.
turso db shell [DATABASE-NAME]
این یک پوسته SQL را باز می کند که در آن می توانید با پایگاه داده ای که ایجاد کرده اید تعامل داشته باشید. این دستور را قرار دهید که جدول popular_destinations را ایجاد می کند و از آنجا، پایگاه داده را با مقداری داده نشان می دهد.
-- create the popular destinations table
CREATE TABLE popular_destinations (
id SERIAL PRIMARY KEY,
country VARCHAR(255) NOT NULL,
name VARCHAR(255) NOT NULL,
location VARCHAR(255) NOT NULL,
image_url VARCHAR(255) NOT NULL
);
-- Seeding up the database
INSERT INTO popular_destinations (country, name, location, image_url)
VALUES
('United States', 'New York City', 'New York', 'https://images.unsplash.com/photo-1485871981521-5b1fd3805eee?ixlib=rb-4.0.3&ixid=MnwxMjA3fDB8MHxzZWFyY2h8M3x8bmV3JTIweW9ya3xlbnwwfDB8MHx8&auto=format&fit=crop&w=500&q=60');
INSERT INTO popular_destinations (country, name, location, image_url)
VALUES
('France', 'Paris', 'Ile-de-France', 'https://images.unsplash.com/photo-1502602898657-3e91760cbb34?ixlib=rb-4.0.3&ixid=MnwxMjA3fDB8MHxzZWFyY2h8M3x8cGFyaXN8ZW58MHwwfDB8fA%3D%3D&auto=format&fit=crop&w=500&q=60');
INSERT INTO popular_destinations (country, name, location, image_url)
VALUES
('Japan', 'Tokyo', 'Kanto Region', 'https://images.unsplash.com/photo-1578469645742-46cae010e5d4?ixlib=rb-4.0.3&ixid=MnwxMjA3fDB8MHxzZWFyY2h8NXx8a3lvdG98ZW58MHwwfDB8fA%3D%3D&auto=format&fit=crop&w=500&q=60');
INSERT INTO popular_destinations (country, name, location, image_url)
VALUES
('Australia', 'Sydney', 'New South Wales', 'https://images.unsplash.com/photo-1526958977630-bc61b30a2009?ixlib=rb-4.0.3&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=870&q=80');
INSERT INTO popular_destinations (country, name, location, image_url)
VALUES
('London', 'UK', 'United Kingdom', 'https://images.unsplash.com/photo-1513635269975-59663e0ac1ad?ixlib=rb-4.0.3&ixid=MnwxMjA3fDB8MHxzZWFyY2h8Mnx8bG9uZG9ufGVufDB8fDB8fA%3D%3D&auto=format&fit=crop&w=500&q=60');
-- Quitting the shell
.quit
اکنون باید URL پایگاه داده و نشانه احراز هویت پایگاه داده را دریافت کرده و آن را روی فایل .env پیکربندی کنیم. در ریشه پروژه، یک فایل .env ایجاد کنید و نام این متغیرها را جایگذاری کنید.
url=YOUR_DATABASE_URL
authToken=YOUR_AUTH_TOKEN
برای دریافت URL، این دستور را اجرا کنید
turso db show [DATABASE-NAME] --url
سپس رمز احراز هویت را ایجاد کنید،
turso db show [DATABASE-NAME] --url
در آخر باید بسته ای به نام نصب کنیم libsql/client
که به ما امکان می دهد با پایگاه داده Turso در برنامه خود تعامل داشته باشیم.
npm install @libsql/client
حالا از ترمینال کافی است و بیایید کمی کد بنویسیم. سرور توسعه دهنده را با اجرا راه اندازی کنید npm run dev
و باز کن localhost:3000
.
در پوشه src یک پوشه به نام db ایجاد کنید و یک فایل turso.ts ایجاد کنید. این کد را در فایل قرار دهید، این کد createClient را از libsql/client وارد میکند و آن را پیکربندی میکند تا بتوانیم کوئریهای SQL را به راحتی در پایگاه داده خود ایجاد کنیم.
import { createClient } from "@libsql/client/web";
export default function Turso() {
const config = {
url: process.env.url,
authToken: process.env.authToken,
}
return createClient(config);
}
سپس یک پوشه دیگر به نام hooks ایجاد کنید و یک فایل به نام ایجاد کنید useFetch.ts
این فایل به ما امکان می دهد تا در پایگاه داده خود پرس و جو کنیم و به عنوان یک حالت بارگیری و خطا و همچنین داده هایی که از پایگاه داده دریافت خواهیم کرد، باز خواهد گشت.
import { useEffect, useState } from "react";
import axios from "axios";
import type { QueryResult } from "../pages";
export type fetchResponse = {
data: QueryResult[];
loading: boolean;
error: string;
};
const useFetch = (url: string): fetchResponse => {
const [data, setdata] = useState<QueryResult[]>(null);
const [loading, setloading] = useState<boolean>(true);
const [error, seterror] = useState<string>("");
useEffect(() => {
axios.get(url).then((res): void => {
setdata(res.data as QueryResult[]);
setloading(false);
})
.catch((err: unknown) => {
if (err instanceof Error) {
seterror(err.message);
setloading(false);
}
});
}, [url]);
return { data, loading, error };
};
export default useFetch;
سپس یک فایل را در آن اضافه کنید src/api
پوشه فراخوانده شد turso.ts
، [pardon my file naming skills]. این فایل شامل یک پرس و جو می شود که جدول محبوب_destination را پرس و جو می کند و داده ها را برمی گرداند.
import Turso from '../../db/turso';
import type { NextApiRequest, NextApiResponse } from 'next';
export default async function Handler(
req: NextApiRequest,
res: NextApiResponse
) {
try {
const client = Turso();
const response = await client.execute("SELECT * FROM popular_destinations;");
const posts = response.rows.map((post) => {
return {
id: post.id,
country: post.country,
name: post.name,
location: post.location,
image_url: post.image_url,
}
})
res.status(200).json(posts);
} catch (error: unknown) {
console.log(error);
if (error instanceof Error) {
res.status(500).json({ message: error.message });
return;
}
}
}
در حال حاضر در نهایت، در index.tsx
صفحه در اینجا ما یک جزء کارت ایجاد می کنیم و آن را با مقداری tailwind سبک می کنیم. سپس داده ها را با استفاده از قلاب useFetch خود واکشی می کنیم و نتایج را با استفاده از شبکه شکل می دهیم.
import { useState } from "react";
import Image from "next/image";
import useFetch from "../hooks/useFetch";
import type { fetchResponse } from "../hooks/useFetch";
export type QueryResult = {
id: number | null;
country: string;
name: string;
location: string;
image_url: string;
};
function cn(...classes: string[]) {
return classes.filter(Boolean).join(" ");
}
export default function MyPage() {
const [isLoading, setLoading] = useState(true);
const { data, loading, error }: fetchResponse = useFetch("/api/turso");
return (
<main className="font-montserrat flex items-center justify-center">
<section>
<h3 className="text-2xl font-medium ">Some Fancy Destinations</h3>
<p className="text-base">
List of Vacation Homes to Enjoy once in a while
</p>
{loading && <p>Loading...</p>}
{error && <p>Error countered while fetching: {error}</p>}
<div className="flex flex-col items-center justify-center gap-5 md:grid md:grid-cols-2 lg:grid-cols-3">
{data?.map((item: QueryResult) => (
<div
className="w-[300px] relative flex flex-col items-center justify-center p-4 m-4 bg-white rounded-xl shadow-md hover:shadow-lg transition duration-500 ease-in-out transform hover:-translate-y-1 hover:scale-110"
key={item.image_url}
>
<Image
src={item.image_url}
alt="Picture of the author"
width={350}
height={200}
priority={false}
onLoadingComplete={() => setLoading(false)}
draggable={false}
className={cn(
"object-cover object-top duration-700 ease-in-out border-[1px]",
isLoading
? "scale-110 blur-2xl grayscale bg-blue-300 "
: "scale-100 blur-0 grayscale-0"
)}
/>
<h3 className="text-lg ">
{item.name}, {item.location}
</h3>
</div>
))}
</div>
</section>
</main>
);
}
و بس. شما پایگاه داده Turso را ایجاد کرده اید، پایگاه داده را بذر کرده اید و آن را در برنامه front-end خود جستجو کرده اید.
اگر از این کار لذت می برید، لطفاً به آن کمک کنید و به من سر بزنید توییتر.