برنامه نویسی

استفاده از 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 خود جستجو کرده اید.

اگر از این کار لذت می برید، لطفاً به آن کمک کنید و به من سر بزنید توییتر.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا