Положения/условия Beatnik garb Переработанная женская одежда

  • Главная
  • Положения и условия

Введение Эти Стандартные положения и условия веб-сайта, написанные на этой веб-странице, регулируют использование вами этого веб-сайта. Настоящие Условия будут применяться в полном объеме и затрагивать использование вами данного Веб-сайта. Используя этот веб-сайт, вы соглашаетесь принять все положения и условия, изложенные здесь. Вы не должны использовать этот веб-сайт, если вы не согласны с какими-либо из этих стандартных положений и условий веб-сайта. Возвращает Купленные товары могут быть возвращены в течение пятнадцати (15) дней с даты покупки за счет покупателя. Товар должен быть возвращен в исходном состоянии и со всей оригинальной упаковкой. Покупатель должен запросить возврат средств до отправки товара обратно по электронной почте Beatnik garb по адресу beatniks@beatnikgarb. com. Права интеллектуальной собственности Помимо контента, которым вы владеете, в соответствии с настоящими Условиями, компания Beatnik и/или ее лицензиары владеют всеми правами на интеллектуальную собственность и материалами, содержащимися на этом Веб-сайте. Вам предоставляется ограниченная лицензия только для целей просмотра материалов, содержащихся на этом веб-сайте. Ограничения Вы специально ограничены от всего следующего публикация любых материалов Веб-сайта в любых других средствах массовой информации; продажа, сублицензирование и/или иное коммерческое использование любых материалов Веб-сайта; публичное исполнение и/или демонстрация любых материалов Веб-сайта; использовать этот Веб-сайт любым способом, который наносит или может нанести ущерб этому Веб-сайту; использование этого Веб-сайта любым способом, который влияет на доступ пользователей к этому Веб-сайту; использование этого веб-сайта в нарушение применимых законов и правил или каким-либо образом может нанести вред веб-сайту или любому физическому или юридическому лицу; участие в любом анализе данных, сборе данных, извлечении данных или любой другой подобной деятельности в отношении этого Веб-сайта; использование этого веб-сайта для участия в любой рекламе или маркетинге.

Доступ к некоторым областям этого веб-сайта ограничен для вас, и одежда Beatnik может дополнительно ограничить ваш доступ к любым областям этого веб-сайта в любое время по абсолютному усмотрению. Любой идентификатор пользователя и пароль, которые вы можете иметь для этого веб-сайта, являются конфиденциальными, и вы также должны соблюдать конфиденциальность. Ваш контент В настоящих Стандартных положениях и условиях веб-сайта «Ваш контент» означает любой аудио-, видеотекст, изображения или другие материалы, которые вы решили отображать на этом Веб-сайте. Показывая свой Контент, вы предоставляете Beatnik garb неисключительную, всемирную безотзывную сублицензируемую лицензию на использование, воспроизведение, адаптацию, публикацию, перевод и распространение на любых носителях. Ваш Контент должен быть вашим собственным и не должен нарушать права третьих лиц. Beatnik Garb оставляет за собой право удалить любой Ваш Контент с этого Веб-сайта в любое время без предварительного уведомления. Нет гарантий Этот веб-сайт предоставляется «как есть» со всеми ошибками, и компания Beatnik не дает никаких заявлений или гарантий любого рода, связанных с этим веб-сайтом или материалами, содержащимися на этом веб-сайте.
Кроме того, никакая информация, содержащаяся на этом веб-сайте, не может быть истолкована как консультация для вас. Ограничение ответственности Ни при каких обстоятельствах компания Beatnik garb, а также ее должностные лица, директора и сотрудники не несут ответственности за что-либо, возникающее в результате или каким-либо образом связанное с использованием вами данного веб-сайта, независимо от того, является ли такая ответственность договорной. Компания Beatnik Garb, включая ее должностных лиц, директоров и сотрудников, не несет ответственности за какую-либо косвенную, косвенную или особую ответственность, возникающую в результате или каким-либо образом связанную с использованием вами данного Веб-сайта. Компенсация Настоящим вы в полной мере освобождаете Beatnik garb от любых и / или всех обязательств, затрат, требований, причин иска, убытков и расходов, возникающих каким-либо образом в связи с нарушением вами любого из положений настоящих Условий. Делимость Если какое-либо положение настоящих Условий будет признано недействительным в соответствии с любым применимым законодательством, такие положения будут удалены, не затрагивая остальные положения настоящего документа.
Изменение условий Beatnik garb может пересматривать настоящие Условия в любое время по своему усмотрению, и, используя этот Веб-сайт, вы должны регулярно просматривать эти Условия. Назначение The Beatnik разрешается переуступать, передавать и передавать в субподряд свои права и/или обязательства в соответствии с настоящими Условиями без какого-либо уведомления. Однако вам не разрешается переуступать, передавать или передавать в субподряд какие-либо из ваших прав и/или обязательств в соответствии с настоящими Условиями. Полное согласие Настоящие Условия представляют собой полное соглашение между Beatnik garb и вами в отношении использования вами данного веб-сайта и заменяют собой все предыдущие соглашения и договоренности. Применимое право и юрисдикция Настоящие Условия будут регулироваться и толковаться в соответствии с законами штата Теннесси, и вы подчиняетесь неисключительной юрисдикции судов штата и федеральных судов, расположенных в Теннесси, для разрешения любых споров.

Как создать масштабируемое веб-приложение с помощью бессерверных технологий

Бессерверная технология позволяет создавать и развертывать эффективные, масштабируемые и современные веб-приложения.

Переходя на бессерверные решения, вы избавляетесь от необходимости управлять сервером и экономите время и деньги. В этом руководстве вы узнаете, как использовать возможности безсерверных приложений, создавая полнофункциональное веб-приложение с использованием различных технологий. Если вы готовы поднять свои навыки веб-разработки на новый уровень и создать действительно масштабируемое приложение, давайте начнем!

Вот исходный код и живая демонстрация.

Предпосылки

Перед началом работы у вас должно быть следующее:

  • хорошее понимание HTML и CSS
  • знание синтаксиса JavaScript ES6
  • понимание React и того, как он работает

В этом проекте я буду использовать Next.js, но не стесняйтесь использовать фреймворк по вашему выбору. Просто убедитесь, что на вашем компьютере установлен Node.js, или вы можете использовать онлайн-редактор кода, например codeandbox.

Обзор проекта

Вы создадите бессерверное приложение для управления ссылками на профили, похожее на Linktree, используя Next. js и TailwindCSS для внешнего интерфейса, PlanetScale для базы данных и Vercel для развертывания. Приложение позволяет пользователям создавать, читать, обновлять и удалять ссылки на свои профили и делиться ими в биографиях социальных сетей.

Настройка среды

Чтобы упростить вам задачу, я создал начальный код с внешним интерфейсом, чтобы вы могли сосредоточиться на самой интересной части (бессерверном бэкенде). Создайте форк codeandbox или выполните следующую команду, чтобы запустить локальную среду разработки.

 пряжа создать следующее приложение profile-links-app -e https://github.com/giridhar7632/profile-links-starter
# или
npx create-next-app profile-links-app -e https://github.com/giridhar7632/profile-links-starter
 

Проверка кода стартера

В начальном коде установлены все необходимые зависимости и пользовательский интерфейс с минимальным стилем с использованием TailwindCSS. Он также имеет ключевые функции, такие как отправка форм, отображение данных из бэкэнда и обработка маршрутизации. Перейдите в каталог проекта и запустите сервер разработки по адресу http://localhost:3000.

 cd профиль-ссылки-приложение
пряжа разработчик
 

Подключение к базе данных PlanetScale

PlanetScale — это MySQL-совместимая бессерверная база данных. Вы можете легко создать базу данных MySQL и подключиться к ней с потрясающим опытом разработчика. Вы можете использовать одну бесплатную базу данных, используя учетную запись PlanetScale. После входа в систему для вас автоматически создается организация. Далее мы создадим и подключимся к базе данных.

Сначала нажмите кнопку «Создать базу данных» и выберите имя и регион для вашей базы данных.

После инициализации базы данных нажмите кнопку «Подключиться» и выберите «Призма» в разделе «Подключиться к». Prisma — это инструмент объектно-реляционного отображения (ORM) с открытым исходным кодом, который обеспечивает простое взаимодействие между базами данных с помощью JavaScript.

В терминале выполните следующую команду для настройки Prisma:

Инициализация призмы
 npx
 

В папке /prisma будет создан файл schema. prisma . Добавьте код с веб-страницы PlanetScale в файл и создайте переменную среды внутри файла 9.0065 .env файл. Схема определяет структуру и информацию о таблицах базы данных, которые для этого приложения будут включать три таблицы: «Пользователь», «Ссылка» и «Социальный», связанные, как показано на схеме.

Откройте файл /prisma/schema.prisma и вставьте следующую схему:

/prisma/schema.prisma

 клиент генератора {
  провайдер = "призма-клиент-js"
}
источник данных БД {
  провайдер = "mysql"
  URL-адрес = env("URL_БАЗА_ДАННЫХ")
  отношениеMode = "призма"
}
модель Ссылки {
  id Int @id @default(автоинкремент())
  строка заголовка
  строка ссылки
  строка идентификатора пользователя?
  Пользователь Пользователь? @relation(поля: [userId], ссылки: [id])
  @@index([идентификатор_пользователя])
}
модель Социальные сети {
  id Int @id @default(автоинкремент())
  строка фейсбука?
  строка инстаграма?
  строка в твиттере?
  Пользователь Пользователь[]
}
модель Пользователь {
  id Строка @id @default(cuid())
  имя Строка?
  строка электронной почты? @уникальный
  строка пароля?
  Socials Socials @relation(поля: [socialsId], ссылки: [id])
  ссылки Ссылки[]
  социальный идентификатор Int
  @@index([социальный идентификатор])
}
 

Теперь выполните следующую команду, чтобы передать схему в базу данных PlanetScale.

 npx prisma db push
 

Чтобы увидеть свою базу данных в действии, выполните следующие команды:

 н/мин затравка
npx призма студия
 

Вкладка браузера данных открывается по адресу http://localhost:5555

Создайте новый файл prisma.js в папке /utils . Этот файл будет содержать экземпляр клиента Prisma, который вы будете использовать для взаимодействия с вашей базой данных.

/utils/prisma.js

 импортировать { PrismaClient } из '@prisma/client'
const prisma = новый PrismaClient()
экспортировать призму по умолчанию
 

Теперь вы можете использовать базу данных из бессерверного бэкенда или внешнего интерфейса.

Бессерверный API: создание серверной части

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

Поскольку вы добавите аутентификацию и другие функции, я создал глобальное состояние для отслеживания сеанса пользователя. Внутри папки /utils вы найдете файл useAuth.js .

/utils/useAuth.js

 импортировать React, {createContext, useContext, useEffect, useState} из 'реагировать'
// создание пользовательского хука для использования контекста в каждом компоненте
экспортировать const useAuth = () => useContext(AuthContext)
// создание контекста
экспортировать константу AuthContext = createContext({})
// определение поставщика контекста
экспортировать константу AuthProvider = ({ дочерние элементы }) => {
  const [user, setUser] = useState('') ​​// состояние для отслеживания пользователя
  const [isAuth, setIsAuth] = useState('') ​​// состояние для отслеживания токена jwt
  использоватьЭффект(() => {
    const token = localStorage.getItem('token') // получение токена из хранилища
    если (токен) {
      setIsAuth (токен)
    } еще {
      localStorage. setItem('токен', isAuth)
    }
  }, [исАус])
  возвращаться (
    
      {дети}
    
  )
}
 

Здесь вы проверите, хранится ли токен JWT в локальном хранилище. Если токен существует, вы обновите глобальное состояние. Позже, при создании API, вам также потребуется отправить запросы на авторизацию для проверки токена.

Добавление пользователей в ваше приложение

Next.js имеет преимущество; любой файл в папке /pages/api считается конечной точкой API. Для аутентификации создайте новый файл с именем register.js внутри /pages/api/user 9Папка 0066.

/страницы/API/пользователь/register.js

 импорт призмы из '../../../utils/prisma'
импортировать jwt из «jsonwebtoken»
импортировать bcrypt из 'bcrypt'
экспортировать обработчик асинхронной функции по умолчанию (req, res) {
  const {имя, электронная почта, пароль, ссылки, социальные сети} = req. body
  пытаться {
    // 1. проверяем, существует ли пользователь
    const user = await prisma.user.findUnique({где: {электронная почта}})
    если (пользователь) {
      // если пользователь существует, возвращаем ошибку
      выдать новую ошибку («Пользователь уже существует! Попробуйте войти в систему»)
    }
    // 2. хешируем пароль и сохраняем пользователя в базе данных
    const hashedPassword = ожидание bcrypt.hash(пароль, 10)
    const newUser = ожидание prisma.user.create({
      данные: {
        имя,
        электронная почта,
        пароль: hashedPassword,
        социальные сети: {
          создавать: {
            ... социальные сети,
          },
        },
        ссылки: {
          создать: ссылки,
        },
      },
    })
    // 3. подписать Json Web Token и отправить его вместе с запросом
    константный токен = jwt.sign({userId: newUser.id}, process.env.JWT_SECRET, {
      expiresIn: '7d',
    })
    res.status(200).json({
      сообщение: 'Пользователь зарегистрирован!',
      жетон,
      пользователь: newUser. id,
      тип: «успех»,
    })
  } поймать (ошибка) {
    console.log(ошибка)
    рез.статус(500).json({
      сообщение: ошибка?.сообщение || 'Что-то пошло не так!',
      тип: 'ошибка',
    })
  } окончательно {
    ждать prisma.$disconnect()
  }
}
 

Чтобы зарегистрировать пользователя, вы должны проверить, существует ли уже этот пользователь в базе данных, используя метод findUnique Prisma. Если нет, вы создадите нового пользователя и отправите токен для аутентификации; в противном случае вернуть ошибку. Вы можете создать нового пользователя, используя метод Prisma create . Для более глубокого понимания аутентификации обратитесь к этой статье.

В файле register.js внутри каталога /pages вы можете найти внешний вид страницы реестра. Теперь добавьте функциональность к onFormSubmit для отправки данных на серверную часть.

/страницы/register.js

 импортировать аксиомы из 'аксиом'
// . ..
импортировать {useAuth} из '../utils/useAuth'
константный регистр = () => {
  // ...
  const { user, setIsAuth, setUser } = useAuth() // получение глобальных состояний
  // перенаправить пользователя после обновления глобального состояния
  использоватьЭффект(() => {
    если (пользователь) {
      Router.replace(`/p/${пользователь}`)
    }
  }, [пользователь])
  // отправка данных пользователя для регистрации пользователя
  const onFormSubmit = handleSubmit (асинхронный (данные) => {
    установить загрузку (истина)
    пытаться {
      // отправка почтового запроса
      const res = await axios.post('/api/user/register', данные)
      setIsAuth(res.data.token) // обновление состояний
      setUser(рез.данные.пользователь)
      перезагрузить()
    } поймать (ошибка) {
      setStatus(error.message || 'Что-то пошло не так!')
    }
    установить загрузку (ложь)
  })
  возвращаться (...)
}
 

Аутентификация сеансов пользователей

Создайте новый файл с именем login. js внутри новой папки /pages/api/user , чтобы добавить конечную точку входа.

/страницы/API/пользователь/логин.js

 импорт призмы из '../../../utils/prisma'
импортировать jwt из «jsonwebtoken»
импортировать bcrypt из 'bcrypt'
экспортировать обработчик асинхронной функции по умолчанию (req, res) {
  const {адрес электронной почты, пароль} = req.body
  пытаться {
    // 1. проверка пользователя
    постоянный пользователь = ожидание prisma.user.findUnique({
      где: {электронная почта},
    })
    если (!пользователь) {
      // если пользователь не существует, возвращаем ошибку
      выдать новую ошибку («Пользователь не существует!»)
    }
    // 2. проверка совпадения пароля
    const isMatch = await bcrypt.compare (пароль, пароль пользователя)
    если (!isMatch) {
      // если пароль не совпадает, возвращаем ошибку
      выдать новую ошибку («Неверный пароль!»)
    }
    // 3. подписать и отправить Json Web Token с ответом
    константный токен = jwt. sign({userId: user.id}, process.env.JWT_SECRET, {
      expiresIn: '7d',
    })
    res.status(200).json({
      сообщение: «Пользователь вошел в систему!»,
      жетон,
      пользователь: user.id,
      тип: «успех»,
    })
  } поймать (ошибка) {
    console.log(ошибка)
    рез.статус(500).json({
      сообщение: error.messsage || 'Что-то пошло не так!',
      тип: 'ошибка',
    })
  } окончательно {
    ждать prisma.$disconnect()
  }
}
 

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

/страницы/логин.js

 импортировать аксиомы из 'аксиом'
// ...
импортировать {useAuth} из '../utils/useAuth'
постоянный Логин = () => {
  // ...
  const {setIsAuth, пользователь, setUser} = useAuth()
  // перенаправить пользователя после обновления глобального состояния
  использоватьЭффект(() => {
    если (пользователь) {
      Router.replace(`/p/${пользователь}`)
    }
  }, [пользователь])
  const onFormSubmit = handleSubmit (асинхронный (данные) => {
    установить загрузку (истина)
    пытаться {
   // 1.  отправка запроса на бэкенд
      const res = await axios.post('/api/user/login', данные)
      setIsAuth(res.data.token)
      setUser(рез.данные.пользователь)
      перезагрузить()
    } поймать (ошибка) {
      setStatus(error.message || 'Что-то пошло не так!')
    }
    установить загрузку (ложь)
  })
  возвращаться (...)
}
 

Получение профилей пользователей

Чтобы отобразить сведения о пользователе, давайте создадим конечную точку для возврата профиля пользователя. Создайте новый файл с именем index.js в папке /pages/api/user .

/страницы/API/пользователь/index.js

 импорт призмы из '../../../utils/prisma'
экспортировать дескриптор асинхронной функции по умолчанию (req, res) {
  const {идентификатор пользователя} = req.body
  пытаться {
    // 1. проверка пользователя в базе данных
    постоянный пользователь = ожидание prisma.user.findUnique({
      где: {идентификатор: userId},
      включать: {
        ссылки: правда,
        соц. : правда,
      },
    })
    если (!пользователь) {
      // если пользователь не существует, возвращаем ошибку
      выдать новую ошибку («Пользователь не существует!»)
    }
    разрешение
      .статус(200)
      .json({сообщение: "Пользователь найден!", профиль: пользователь, тип: "успешно"})
  } поймать (ошибка) {
    console.log(ошибка)
    рез.статус(500).json({
      сообщение: ошибка?.сообщение || 'Что-то пошло не так!',
      тип: 'ошибка',
    })
  } окончательно {
    ждать prisma.$disconnect()
  }
}
 

Чтобы отобразить профиль пользователя, создайте динамический маршрут, который обновляет страницу с помощью параметров запроса. Внутри /pages/p/[id].js вы можете получить id в качестве параметра запроса и обновить данные страницы, используя getStaticProps .

/страницы/p/[id].js

 импортировать аксиомы из 'аксиом'
импортировать призму из '../../utils/prisma'
// ...
const Profile = ({ профиль, сообщение, тип }) => {. ..}
экспортировать асинхронную функцию getStaticProps ({ params }) {
  пытаться {
  // получение профиля пользователя
    const {данные} = ожидание axios.post(`${baseUrl}/api/user`, {
      идентификатор пользователя: params.id,
    })
    return { // отправка пользовательских данных в качестве реквизита
      реквизит: {...данные},
   перепроверить: 10
    }
  } поймать (ошибка) {
    console.log(ошибка)
    возвращаться {
      реквизит: {сообщение: 'Пользователь не найден! 😕», введите: «ошибка» },
    }
  }
}
экспортировать асинхронную функцию getStaticPaths() {
  const users = await prisma.user.findMany({ select: {id: true } })
  возвращаться {
    пути: users.map((item) => ({
      параметры: {id: item.id},
    })),
    запасной вариант: правда,
  }
}
 

Теперь вы можете увидеть страницу с информацией о пользователе, которая должна выглядеть примерно так:

Реализация авторизации

Для защиты API необходимо реализовать авторизацию, разрешив пользователю доступ к определенному ресурсу. Для этого вы будете использовать токены JWT для авторизации запроса. Ссылка node.js, вы можете добавить промежуточную функцию, которая выполняет некоторые действия до того, как будет выполнен обработчик основной функции. Лучший способ использовать ПО промежуточного слоя в бессерверных функциях Next.js — поместить обработчик функции в функцию ПО промежуточного слоя. Создайте новый файл с именем авторизацияMiddleware.js внутри папки /utils и добавьте следующий код:

/utils/authorizationMiddleware.js

 импортировать jwt из jsonwebtoken
// 1. принять функцию-обработчик на вход
функция авторизации промежуточного программного обеспечения (обработчик) {
  вернуть асинхронное (требование, разрешение) => {
    пытаться {
      // 2. проверяем валидный токен в заголовках
      константный токен = req.headers['авторизация'].split(' ')[1]
      const {userId} = jwt.verify (токен, process.env.JWT_SECRET)
      req.user = идентификатор пользователя
      // 3.  выполнить основной обработчик запроса
      обработчик ожидания возврата (req, res)
    } поймать (ошибка) {
      console.log(ошибка)
      return res.status(401).json({сообщение: "Не авторизовано", тип: "ошибка"})
    }
  }
}
экспортировать авторизацию по умолчанию
 

Чтобы избежать повторного входа в систему, вы можете проверить токен в локальном хранилище и отправить данные напрямую. Создайте новый файл с именем verify.js в папке /pages/api/user , чтобы добавить новую конечную точку.

/страницы/API/пользователь/verify.js

 импортировать промежуточное ПО авторизации из «../../../utils/authorizationMiddleware»
импортировать призму из '../../../utils/prisma'
// промежуточное ПО авторизации
экспортировать авторизацию по умолчаниюMiddleware (дескриптор асинхронной функции (req, res) {
  постоянный идентификатор пользователя = req.user
  пытаться {
    // 1. проверка пользователя
    постоянный пользователь = ожидание prisma. user.findUnique({
      где: {идентификатор: userId},
      включать: {
        ссылки: правда,
        соц.: правда,
      },
    })
    если (!пользователь) {
      // если пользователь не существует, возвращаем ошибку
      выдать новую ошибку («Пользователь не существует!»)
    }
    // 2. отправляем данные пользователя
    разрешение
      .статус(200)
      .json({сообщение: 'Пользователь найден!', пользователь: user.id, тип: 'успешно' })
  } поймать (ошибка) {
    console.log(ошибка)
    рез.статус(500).json({
      сообщение: ошибка?.сообщение || 'Что-то пошло не так!',
      тип: 'ошибка',
    })
  } окончательно {
    ждать prisma.$disconnect()
  }
})
 

Эта функция аналогична входу в систему, но для авторизации пользователя необходимо добавить промежуточное программное обеспечение. Обратите внимание, что с этого момента вам нужно будет добавить авторизацию для защиты всех конечных точек API.

Вы будете отправлять запрос во внешнем интерфейсе всякий раз, когда пользователь открывает приложение. Перейдите к файлу /utils/useAuth.js и добавьте еще одну функцию getUser для обновления состояния пользователя с помощью токена.

/utils/useAuth.js

 импортировать аксиомы из 'аксиом'
// ...
экспортировать константу AuthProvider = ({ дочерние элементы }) => {
  // ...
  использоватьЭффект(() => {
    постоянный токен = localStorage.getItem('токен')
    // проверка пользователя
    const getUser = асинхронный (tkn) => {
      const {данные: res} = ожидание axios.get('/api/user/verify', {
        заголовки: {
          Принять: 'приложение/json',
          «Тип контента»: «приложение/json»,
          Авторизация: `Bearer ${tkn}`,
        },
      })
      setUser(res.user) // обновление состояния
    }
    если (токен) {
      setIsAuth (токен)
      получитьпользователя (токен)
    } // ...
  }, [исАус])
  возвращаться (...)
}
 

Если вы перезагрузите страницу с вашими данными, вы увидите активный сеанс с некоторыми дополнительными кнопками.

Перейдем к реализации функционала по созданию, обновлению и удалению ссылок в профиле пользователя. Создайте файл с именем create.js в новой папке /pages/api/link для новой конечной точки, чтобы добавить ссылки в профиль. Вы можете добавить новую запись в таблицу ссылок с помощью функции create и подключить ее к пользователю с помощью идентификатор пользователя .

/страницы/API/ссылка/create.js

 импортировать промежуточное ПО авторизации из «../../../utils/authorizationMiddleware»
импортировать призму из '../../../utils/prisma'
// авторизуем пользователя
экспортировать авторизацию по умолчаниюMiddleware (дескриптор асинхронной функции (req, res) {
  const {данные} = req.body
  пытаться {
    постоянный идентификатор пользователя = req.user
    // создание новой ссылки в таблице и подключение к пользователю
    постоянная ссылка = ожидание prisma.links.create({
      данные: {. ..данные, пользователь: {connect: {id: userId} } },
    })
    res.status(200).json({сообщение: 'Ссылка создана!', ссылка, тип: 'успешно' })
  } поймать (ошибка) {
    console.log(ошибка)
    рез.статус(500).json({
      сообщение: ошибка?.сообщение || 'Что-то пошло не так!',
      тип: 'ошибка',
    })
  } окончательно {
    ждать prisma.$disconnect()
  }
})
 

Теперь во внешнем интерфейсе обновите функцию handleAddLink в файле /pages/p/[id].js , чтобы добавить функциональность. Не забудьте добавить токен в заголовок для доступа к защищенным конечным точкам.

/страницы/p/[id].js

 импортировать аксиомы из 'аксиом'
// ...
const Profile = ({ профиль, сообщение, тип }) => {
  const [ссылки, setLinks] = useState(profile?.links || [])
  const {пользователь, isAuth} = useAuth()
  const handleAddLink = async (данные) => {
    пытаться {
      // 1. отправить запрос на публикацию в API вместе с JWT
      const res = ожидание axios. post(
        '/API/ссылка/создать',
        { данные },
        {
          заголовки: {
            Принять: 'приложение/json',
            «Тип контента»: «приложение/json»,
            Авторизация: `Bearer ${isAuth}`,
          },
        }
      )
      // 2. обновить состояние интерфейса
      setLinks((prev) => [...prev, res.data.link])
    } поймать (ошибка) {
      console.log(ошибка)
    }
  }
  // ...
  возвращаться (...)
}
// ...
 

Чтобы обновить конкретную ссылку, вам нужно получить ссылку с идентификатором , подключенную к конкретному пользователю, и отредактировать таблицу с помощью функции обновления .

/страницы/API/ссылка/update.js

 импортировать промежуточное ПО авторизации из «../../../utils/authorizationMiddleware»
импортировать призму из '../../../utils/prisma'
экспортировать авторизацию по умолчаниюMiddleware (дескриптор асинхронной функции (req, res) {
  const {идентификатор, ссылка} = req. body
  пытаться {
    // 1. зашифровать идентификатор пользователя авторизацией
    постоянный идентификатор пользователя = req.user
    // 2. найти ссылку по id, связанную с id пользователя и обновить
    константные данные = ожидание prisma.links.update({
      где: {идентификатор},
      данные: {
        ...связь,
        Пользователь: {
          подключиться: {идентификатор: userId},
        },
      },
    })
    // 3. отправить ответ
    разрешение
      .статус(200)
      .json({сообщение: "Пользователь найден!", ссылка: данные, тип: "успешно"})
  } поймать (ошибка) {
    console.log(ошибка)
    рез.статус(500).json({
      сообщение: ошибка?.сообщение || 'Что-то пошло не так!',
      тип: 'ошибка',
    })
  } окончательно {
    ждать prisma.$disconnect()
  }
})
 

Затем в файле по адресу /components/ProfileLink.js обновите функцию handleUpdateLink , чтобы добавить возможность взаимодействия со ссылкой.

/components/ProfileLink. js

 импортировать аксиомы из 'аксиом'
// ...
const ProfileLink = ({id, title, setLinks, own, token, link }) => {
  const handleUpdateLink = async (данные) => {
    пытаться {
      // 1. отправить запрос на публикацию в API вместе с JWT
      const res = ожидание axios.post(
        '/API/ссылка/обновление',
        {идентификатор, ссылка: данные},
        {
          заголовки: {
            Принять: 'приложение/json',
            «Тип контента»: «приложение/json»,
            Авторизация: `Bearer ${токен}`,
          },
        }
      )
      // 2. обновить состояние интерфейса
      setLinks((prev) => prev.map((i) => (i.id === id ? res.data.link : i)))
    } поймать (ошибка) {
      console.log(ошибка)
    }
  }
  const handleDeleteLink = async () => {...}
  возвращаться (...)
}
 

Prisma предоставляет функцию удаления для удаления определенной записи из таблицы.

/страницы/API/ссылка/delete.js

 импортировать промежуточное ПО авторизации из «. ./../../utils/authorizationMiddleware»
импортировать призму из '../../../utils/prisma'
экспортировать авторизацию по умолчаниюMiddleware (дескриптор асинхронной функции (req, res) {
  const {id} = req.body
  пытаться {
    // удаляем ссылку по id
    ждите prisma.links.delete({
      где: {идентификатор},
    })
    res.status(200).json({ сообщение: 'Ссылка удалена!', тип: 'успешно' })
  } поймать (ошибка) {
    console.log(ошибка)
    рез.статус(500).json({
      сообщение: ошибка?.сообщение || 'Что-то пошло не так!',
      тип: 'ошибка',
    })
  } окончательно {
    ждать prisma.$disconnect()
  }
})
 

В файле /components/ProfileLink.js обновите функцию handleDeleteLink , чтобы пользователь мог удалить ссылку, нажав кнопку удаления.

/components/ProfileLink.js

 // ...
const ProfileLink = ({id, title, setLinks, own, token, link }) => {
  const handleUpdateLink = async (данные) => {...}
  константа handleDeleteLink = async () => {
    пытаться {
      // 1.  отправить запрос на публикацию в API вместе с JWT
      жду axios.post(
        '/API/ссылка/удалить',
        { идентификатор },
        {
          заголовки: {
            Принять: 'приложение/json',
            «Тип контента»: «приложение/json»,
            Авторизация: `Bearer ${токен}`,
          },
        }
      )
      // 2. обновить состояние интерфейса
      setLinks((prev) => prev.filter((i) => i.id !== id))
    } поймать (ошибка) {
      console.log(ошибка)
    }
  }
  возвращаться (...)
}
 

После этого шага у вас будет полнофункциональное приложение для добавления всех ваших ссылок в одном месте и публикации вашего профиля в социальных сетях. Если вы столкнулись с какими-либо проблемами, попробуйте исправить их с помощью исходного кода или поискать решение в Интернете.

Развертывание вашего приложения в Интернете

Теперь пришло время запустить наше приложение в производство. Vercel обеспечивает бесшовную интеграцию для Next.js и бессерверных функций. Чтобы упростить развертывание, вы можете отправить свой код на GitHub или другого поставщика Git. Войдите в облако Vercel, используя своего поставщика Git, и создайте новое развертывание. Импортируйте репозиторий Git, добавьте переменные среды на странице «Настроить проект» и нажмите кнопку «Развернуть», чтобы увидеть свое приложение вживую. Вы также можете использовать других облачных провайдеров, таких как Netlify или AWS, поскольку некоторые из них обеспечивают базовую поддержку Next.js и бессерверных функций.

Сводка и следующие шаги

Итак, вы узнали о бессерверных вычислениях и о том, как они помогают создавать масштабируемые приложения. Вы создали полнофункциональное веб-приложение с использованием различных бессерверных технологий, включая PlanetScale в качестве бессерверной базы данных и Vercel в качестве бессерверного провайдера. Бессерверный мир постоянно развивается, и вводятся новые расширенные функции, которые революционизируют способы разработки веб-приложений.