풀 스택 React 및 Node.js - 데이터베이스!
25187 단어 databasenodereactjavascript
필요한 모든 편집은 서버에 있습니다. 우리는 편의를 위해 Prisma ORM과 SqlLite DB를 사용할 것입니다. node-server에 설치해야 합니다.
Express가 데이터베이스에 연결하는 데 사용할 Prisma 클라이언트를 설치합니다.
npm i -S @prisma/client
다음으로 역시 서버에 Prisma를 설치합니다.
npm i -D prisma
-D
is shorthand for--save-dev
. This saves the package under devDependencies
node-server에서 새 폴더 prisma를 만듭니다.
폴더 prisma에서 새 파일 schema.prisma를 만듭니다. 내용을 다음으로 설정합니다.
datasource db {
provider = "sqlite"
url = "file:./data.db?connection_limit=1"
}
generator client {
provider = "prisma-client-js"
}
model Note {
id String @id @default(cuid())
title String
content String
authorId String
lang String
isLive Boolean
category String
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
author Author @relation(fields: [authorId], references: [id], onDelete: Cascade, onUpdate: Cascade)
}
model Author {
id String @id @default(cuid())
username String @unique
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
notes Note[]
}
여기에 두 개의 테이블이 있습니다.
SqlLite 데이터베이스 파일을 생성하려면 node-server 폴더에서 다음 명령을 실행합니다.
npx prisma db push
이제 DB 엔터티를 생성하려면 다음을 실행합니다.
npx prisma generate
node-server에서 새 폴더(models)를 만듭니다. node-server/models 내부에서 3개의 새 파일을 생성합니다.
db.js를 다음과 같이 편집합니다.
const { PrismaClient } = require("@prisma/client")
let prisma;
if (process.env.NODE_ENV === "production") {
prisma = new PrismaClient()
} else {
const {__db__} = global;
if (__db__) {
prisma = __db__
} else {
prisma = new PrismaClient({
log: [
{
emit: "event",
level: "query",
},
"info",
"warn",
"error",
],
});
prisma.$on("query", ({query, duration}) => {
console.log(`\x1b[36mprisma:query\x1b[0m ${query}`);
console.log(`Took: ${duration}ms`)
});
global.__db__ = prisma
}
prisma.$connect();
}
module.exports = {
prisma
}
개발 환경에서 이것은 단일 prisma 인스턴스를 생성하고 이를 글로벌로 저장하고 SQL 쿼리를 콘솔에 기록합니다.
author.model.js를 다음과 같이 편집합니다.
const { prisma } = require("./db")
async function getAuthor(id) {
return prisma.author.findUnique({ where: { id } });
}
async function getAuthorByName(username) {
return prisma.author.findUnique({ where: { username } });
}
async function createAuthor(
author
) {
return prisma.author.create({
data: author
});
}
module.exports = {
getAuthor,
getAuthorByName,
createAuthor,
}
note.model.js를 다음과 같이 편집합니다.
const { prisma } = require("./db")
async function getNotes() {
return prisma.note.findMany();
}
async function getNote(id) {
return prisma.note.findUnique({ where: { id } });
}
async function createNote(
note
) {
return prisma.note.create({
data: note
});
}
async function updateNote(
note
) {
return prisma.note.update({
data: note,
});
}
module.exports = {
getNotes,
getNote,
createNote,
updateNote,
}
그러면 데이터 액세스 계층이 완료됩니다. 이제 이러한 ORM 기능을 컨트롤러에서 사용하여 데이터에 액세스할 수 있습니다.
먼저 데이터베이스를 시드할 스크립트를 만들어야 합니다. prisma 폴더에서 새 파일 seed.js를 만듭니다.
const { PrismaClient } = require("@prisma/client")
const prisma = new PrismaClient();
async function seed() {
// Blitz everything!
await prisma.note.deleteMany();
await prisma.author.deleteMany();
const author = await prisma.author.create({
data: {
username: 'neohed'
},
});
await prisma.note.create({
data: {
title: 'A New Note',
content: 'This note is retrieved from the database!',
authorId: author.id,
lang: 'en',
isLive: true,
category: '',
},
});
console.log(`Database has been seeded. 🌱`)
}
seed()
.then(() => {
console.log('Prisma seed function in prisma/seed.js executed!')
})
.catch((e) => {
console.error(e);
process.exit(1)
})
.finally(async () => {
await prisma.$disconnect()
})
이제 package.json에서 이 스크립트를 참조해야 합니다. 다음과 같이 package.json을 편집합니다.
{
"name": "server",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"start": "node index.js",
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"@prisma/client": "^4.0.0",
"body-parser": "^1.20.0",
"cors": "^2.8.5",
"express": "^4.18.1",
"morgan": "^1.10.0"
},
"devDependencies": {
"prisma": "^4.0.0"
},
"prisma": {
"seed": "node prisma/seed.js"
}
}
이제 시드 스크립트를 실행하고 다음을 실행합니다.
npx prisma db seed
이것은 seed.js 스크립트를 실행하고 데이터베이스를 하나의 작성자와 하나의 메모 레코드로 채웁니다.
마지막으로 note.controller.js를 다음과 같이 편집합니다.
const authorRepo = require('../models/author.model');
const noteRepo = require('../models/note.model');
async function getNote(req, res) {
const notes = await noteRepo.getNotes();
//HACK return top 1 note
const { authorId, ...noteRest } = notes[0];
const { username } = await authorRepo.getAuthor(authorId);
res.json({ note: {
...noteRest,
author: username
}
});
}
async function postNote(req, res) {
const {body} = req;
const {id, title, content, author, lang, isLive, category} = body;
console.log('Server received data:');
console.log({id, title, content, author, lang, isLive, category})
res
.status(200)
.json({
message: 'Ok'
})
}
module.exports = {
getNote,
postNote
}
지금 서버와 클라이언트를 실행하면 SqlLite 데이터베이스에서 로드된 다른 데이터를 볼 수 있습니다! 서버 콘솔에 기록된 SQL 쿼리도 볼 수 있습니다.
다음으로 양식을 완성하고 몇 가지 누락된 기능을 추가합니다...
코드 저장소: Github Repository
Reference
이 문제에 관하여(풀 스택 React 및 Node.js - 데이터베이스!), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/neohed/full-stack-react-nodejs-database-3c3l텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)