使用硝基 +prismaðº +mongodbð的简单REST API
#node #ptbr #prisma #mongodb

通过使用JavaScript/node.js来研究建筑物API或Web服务,通​​常可以使用框架(高指南,使用节点的本地本地)(例如ExpressNestJS)找到各种教程,在社区中广泛使用了健康的工具。预计,考虑到JavaScript生态系统的大小,我们不仅限于两个工具,对吗?

最近,Nuxt 3的发展一直引起我的注意开发框架的基础。

Uny

NUXT团队创建了组织UnJS,负责创建和维护几个“通用”和任何框架和/或环境的代理的软件包。一起,其中许多包装形成了NUXT 3的基础。

H3 E硝基

作为一个全栈框架,NUXT提供了在项目中创建HTTP服务器的能力,H3对此负责。当隔离时,H3与Express非常相似,但是使用回调的事件系统系统。

我们将在本教程中使用的

o Nitro将H3 H3服务器与其他一些UNJS库相结合,这些库中的一些有趣的功能,例如 autoimports 已安装的库和基于文件(如我们在Next.js或NUXT本身之类的框架中找到的那样)。

Nitro是在NUXT 3项目的server文件夹中自动生成的HTTP服务器。

我们今天要建造什么?

我们将从零图书馆休息中创建,管理书籍,作者和gãnneros。

  • 我们将使用Nitro用作服务器http。
  • 我们的ORM将是Prisma
  • 数据库将是在Atlas中创建的Atlas中的一个实例。

mkdir books-nitro-api
cd books-nitro-api
npm init -y

npm install --dev nitropack

打开代码编辑器中的文件夹,我们可以将Nitro脚本插入到我们的package.json中。结果应与以下方式相似。

{
  "name": "books-nitro-api",
  "version": "1.0.0",
  "license": "MIT",
  "scripts": {
    "dev": "nitro dev",
    "build": "nitro build"
  },
  "devDependencies": {
    "nitropack": "^1.0.0"
  }
}

Typescript由Nitro自动管理。
让我们在我们项目的根部创建tsconfig.json文件,并添加以下包含在documentação上的包含。

{
  "extends": "./.nitro/types/tsconfig.json"
}

运行项目后,将自动生成.nitro.output文件夹。

完成配置步骤,让我们添加nitro.config.ts文件,然后插入与Nitro configuração函数相对应的包含的包含。

import { defineNitroConfig } from 'nitropack'

export default defineNitroConfig({})

让我们创建我们的第一个路线,如前所述,Nitro具有基于文件的系统来定义其路线。在根上,我们将创建router文件夹,并创建将与服务器的/路由相对应的Koud7文件。

index.ts文件中,我们将定义我们的第一个事件以及其基本库H3,Nitro是基于事件的。

// routes/index.ts
export default defineEventHandler((event) => {
  return "<h1>Hello World</h1>";
});

文件结构应与下图相似。

code

使用以下命令启动开发服务器:

npm run dev

终端应显示以访问服务器的URL,如下图中:

code
请注意,.nitro.output文件夹是自动生成的。

输入浏览器中提供的URL时,我们有在Koud12

文件中写的返回

code

mongodb

我们不会在本教程中详细介绍使用MongoDB创建数据库。

打开一个新指南,在MongoDB Atlas上创建一个帐户,然后在您已经与银行连接的string时回到这里。

...

你回来了吗?以下安装棱镜!

安装Prisma

让我们使用Prisma作为我们的ODM,这是数据库和编程语言之间的翻译范围。

让我们使用以下命令安装棱镜作为开发依赖性:

npm install prisma --save-dev

不久之后,让我们使用以下命令实例化Prism文件:

npx prisma init --datasource-provider mongodb

您会意识到,我们项目的档案中存在变化,以前的命令创建了一个称为Koud14的文件夹和一个对应于应用程序环境设置的.env文件。

文件结构必须看起来像下面的图:

code

在Koud15文件中将具有称为Koud17的属性,这是我们将连接字符串粘贴到MongoDB的地方,类似于下面的摘要:

// .env
DATABASE_URL="mongodb+srv://USERNAME:PASSWORD@HOST:PORT/DATABASE"

打开koud18文件,我们有一些自动插入Prism的信息,例如客户端(我们将在下一步中安装),数据库,MongoDB在我们的情况下以及一个导入我们的方差环境的URL将我们的API连接到云数据库。

// prisma/schema.prisma

generator client {
  provider = "prisma-client-js"
}

datasource db {
  provider = "mongodb"
  url      = env("DATABASE_URL")
}

在这里,我们还将与其他与其他银行相关的字段创建一个基本的书籍模型。让我们添加以下摘录có³doda:


model Book {
  id          String    @id @default(auto()) @map("_id") @db.ObjectId
  name        String
  isbn        String    @unique
  description String
  createdAt   DateTime  @default(now())
  updatedAt   DateTime  @updatedAt
}

  • model Book-在这里,我们通知模式,我们将在关系银行中创建一个文档集合,创建一个表。
  • id String @id @default(auto()) @map("_id") @db.ObjectId-每个mongoDB文档都有一个字符串类型,在行末尾表示 @ notes。这些笔记的范围从棱​​镜内的银行到银行。
  • 我们声明字符串类型的名称,ISBN和描述属性,注意我们在ISBN字段中插入的@unique概念,表明无法重复此值,并且适用于每个文档。
  • 不需要创建和更新的字段,但是很有趣的是,何时创建记录和更新记录,笔记是Prisma标准。
  • 其他相关信息可以在documentação中找到。

安装Prisma客户端

Prisma客户端是负责管理数据库并基于我们在上一步中创建的模式生成SCIPT的PRISM的一部分。使用以下命令安装库:

npm install @prisma/client

安装库后,是时候生成我们项目的打字稿使用的特定提示,而每次修改架构,我们都必须运行命令

npx prisma generate dev

实例化Prisma客户

在我们的所有应用程序中,我们只能通过管理所有请求来拥有一个Prism客户。

在我们项目的根部和其中创建一个utils文件夹,其中包含以下内容的prisma.ts文件:

import { PrismaClient } from "@prisma/client";

const prisma = new PrismaClient();

export { prisma };

创建API路由

基于事件的且借助基于文件的路由系统,Nitro与其他框架的架构组织略有不同。

在koud27文件夹中,然后创建api文件夹和以下文件结构:

code

请注意,我们的全部请求http在文件中声明。
两个文件都将负责API中的同一URL,http://minhapi/api/books,但一个带有整个GET,另一个带有整个Koud31。
(了解有关母亲http的更多信息)[https://developer.mozilla.org/pt-BR/docs/Web/HTTP/Methods]

从母亲的代码开始©All GET

// routes/api/books.get.ts

import { prisma } from "../../utils/prisma";

export default defineEventHandler(async (event) => {
  const books = await prisma.book.findMany();
  return books;
});

  • 在第一行中,我们导入了我们在上一步中实例化的棱镜的客户。
  • 很快,我们在整个Nitro路由上按模式导出H3 defineEventHandler功能,Nitro将管理H3的导入H3,而无需明确声明。 /LI>
  • defineEventHandler功能接收了帕拉诺(Parano)的矮人功能,该功能展示了我们从帖子开始以来谈论的活动,当我们对整个帖子发表评论时,这将是更多。
  • 作为矮人的功能,我们通过Parano是Asancron,veja mais sobre assincronismo no JS,我们定义了一个常数的books,我们希望我们的Prism客户端将通过findMany()返回所有API书籍。
  • 最后,我们将结果退还给请求我们API数据的客户。
// routes/api/books.post.ts

import { prisma } from "../../utils/prisma";

export default defineEventHandler(async (event) => {
  const payload = await readBody(event);

  const newBook = await prisma.book.create({ data: payload });
  return newBook;
});

  • 遵循与上一个标准结构相同的标准结构,但请注意,在常数payload中,我称之为另一个母亲©H3,并将我的事件作为parano传递。我们请求的所有数据都保存在事件中。在这种情况下,我们正在阅读根据请求发送的主体,并使用要注册的书的数据。
  • 在常数newBook中,我们使用了母亲©Toda create()从Prisma插入数据库中,然后将其返回到下一行中。

入口,这是使用此堆栈非常简单的API的教程。也许我在其他帖子中回到这里,讨论本指南中遗漏的更多详细信息(更复杂的路线,错误处理,事件操纵,中间件...)