노드 HarperDB REST API
너무 길어서 읽을 수가 없어요.
Completed code repo using "books"
instead of "games"
앞말
이 글은 단지'빠른 즉각적인 만족'을 위한 것이 아니다당신의 경험 수준에 따라 이 코드 중 일부는 이해하기 어려울 수도 있습니다. 왜냐하면 저는 이 과정에서 무미건조한 코드 모델과 모듈화 구조를 보여 주려고 하기 때문입니다.한번 보다👀 환매 시👆🏽 뭐 공부 해요?💡 계속하기 전에, 만약 당신이 좋아한다면, (그러나 복사/붙여넣지 마세요. - 이것은 배울 수 없습니다.)🙅🏽♂️)
이 글은 단지'빠른 즉각적인 만족'을 위한 것이 아니다당신의 경험 수준에 따라 이 코드 중 일부는 이해하기 어려울 수도 있습니다. 왜냐하면 저는 이 과정에서 무미건조한 코드 모델과 모듈화 구조를 보여 주려고 하기 때문입니다.한번 보다👀 환매 시👆🏽 뭐 공부 해요?💡 계속하기 전에, 만약 당신이 좋아한다면, (그러나 복사/붙여넣지 마세요. - 이것은 배울 수 없습니다.)🙅🏽♂️)
Node를 사용하여 REST API를 구축합니다.js 및 HarperDB
아만 미타르・ 20년 7월 23일・ 12분 읽기
#node
#javascript
#webdev
#database
.ltag__ 사용자 id__399959.작업 버튼 따르기
배경색: #403b8a!중요했어
#fffff!중요했어
테두리 색상: #403b8a!중요했어
}
마고 마카베
On the innovative team @ HarperDB. Podcast host. Tech blogger. DevRel. Women in tech.
Harper DB에서 온 그녀는 여기에서 Harper와 Node에 대한 배경 지식을 많이 소개했다.
Node를 사용하여 REST API를 구축합니다.js 및 HarperDB
아만 미타르・ 20년 7월 23일・ 12분 읽기
#node
#javascript
#webdev
#database
노드 JS/TS Starter Repos
마나프 미스라・ 20년10월23일・ 2분 읽기
#node
#beginners
#typescript
This 'starter template repo' - 전체 코드 재구매 기준👆🏽 -
webpack
대신 허용 import
, 절대 가져오기, 스웨이드 및 일부 기본 이니시에이터를 위한 구성 포함🌱 건축학🏗️, 또 다른 좋은 것들이 있어요.🧁. 본고의 나머지 부분은 당신이 사용하고 있거나 유사한 것을 가정할 것입니다.
상술하다👆🏽 starter 템플릿 repo, "노드 starter"
개요
Express를 사용하여 Node에서 작성된 RESTful API를 만듭니다.우리는 기본적으로 때가 쌓이는 것을 실현할 것이다.나는 작은 비디오 게임 목록을 만들 것이지만, 너는 네가 원하는 모든 것을 신청할 수 있다.
이곳의 가설은 네가 확실히
기억하고 이해했다는 것이다 foundations of Node.
나는 추가 의존 항목을 설치하기 위해 require
을 사용할 것이다.
RESTful API의 기본 개념
입문
이동
및 시작
완료되면 새 인스턴스를 만들 수 있습니다.나는 나의 것을 전자오락이라고 부르지만, 너는 이렇게 할 수 있다📕s, 또는 "동영상"따위.
HarperDB
기록하다🎵 사용자 이름 및 암호
다음 화면 "Instance Specs"에서 모든 기본값이 좋습니다. "인스턴스 지역"보다 가까운 지리적 위치를 선택할 수 있습니다.
인스턴스를 만드는 데 몇 분 정도 걸립니다. 이 부분은 MongoDB보다 느릴 수 있습니다.⏳.
완성된 후에 이 실례를 누르면 간단한 모델을 만들어야 합니다.이것은 단지 데이터를 묘사하는 시스템일 뿐이다.
"dev"라는 테이블을 만들고, "games"라는 테이블을 만들 수 있습니다. (예를 들어 데이터를 저장하는 전자 테이블) 이 테이블은 "id"로 추적합니다.
HarperDB 비밀 연결 Deets in'.환경
프로젝트 디렉토리에''을 생성합니다.env 파일은 우리의 연결 상세한 정보를 저장합니다.
이 파일은 무시됩니다.🙈 을 통해gitignore "그래서 우리 환매에 나타나지 않을 거예요.👆🏽).
VS 코드(또는 텍스트 편집기)에서 필요한 세부 정보를 붙여넣을 수 있습니다. 아래와 같이 관련 정보를 자신의 것으로 바꿀 수 있습니다.
# This will be used by express
PORT=8000
INSTANCE_URL=https://node-demo-codefinity.harperdbcloud.com
INSTANCE_USERNAME=codefinity
INSTANCE_PASSWORD=someSecretSpit
# What you entered as your schema name
INSTANCE_SCHEMA=dev
구성 탭에서 찾을 수 있습니다 npm
:
Express 서버
ExpressJS는 노드의 맨 위에 있는 중간부품 프레임워크로 루트 요청을 잘 관리합니다.설치합시다: INSTANCE_URL
.
우리는 또 필요로 한다. npm i express
, 이렇게 하면 우리는 이것들을 얻을 수 있다.env'deets는 우리에게 전해준다npm i dotenv
.
src/index의 내부입니다.js, 다음과 같이 기본 Express 서버를 설정합니다.
// 'import' works b/c of the webapack config 🤓
import express from "express";
// We are destructuring 'config' directly from 'dotenv
import { config } from "dotenv";
// Intialize stuff from '.env'
config();
const app = express();
// Configure 'Express' to receive URL encoded JSON
app.use(express.urlencoded({ extended: true }));
app.use(express.json());
// Set up a test route
app.get("/", (_, res) => {
res.end("Express Server");
});
// Start listening for requests on our 'secret port'
app.listen(process.env.PORT, () => {
console.log("Server 🏃🏽♂️", process.env.PORT);
});
Express Server 시작 및 라우팅 테스트
제가 전에 언급한'첫 번째 환매'👆🏽 express
및 webpack
를 사용하여 프로젝트의 변경 사항을 구축하고 관찰합니다.
터미널 창에서 프로젝트 디렉토리로부터: nodemon
.그리고 별도의 터미널 창에서: npm run watch
.
우체부(또는 불면증자) 테스트 노선
지금 당신은
(또는 불면증) 이 필요합니다.
나는 Postman을 사용하여 우리의 간단한 획득 노선을 테스트할 것이다. 거기서 우리는 응답으로 돌아가야 한다. npm run serve
.
이동 및 시작
완료되면 새 인스턴스를 만들 수 있습니다.나는 나의 것을 전자오락이라고 부르지만, 너는 이렇게 할 수 있다📕s, 또는 "동영상"따위.
HarperDB
기록하다🎵 사용자 이름 및 암호
다음 화면 "Instance Specs"에서 모든 기본값이 좋습니다. "인스턴스 지역"보다 가까운 지리적 위치를 선택할 수 있습니다.
인스턴스를 만드는 데 몇 분 정도 걸립니다. 이 부분은 MongoDB보다 느릴 수 있습니다.⏳.
완성된 후에 이 실례를 누르면 간단한 모델을 만들어야 합니다.이것은 단지 데이터를 묘사하는 시스템일 뿐이다.
"dev"라는 테이블을 만들고, "games"라는 테이블을 만들 수 있습니다. (예를 들어 데이터를 저장하는 전자 테이블) 이 테이블은 "id"로 추적합니다.
HarperDB 비밀 연결 Deets in'.환경
프로젝트 디렉토리에''을 생성합니다.env 파일은 우리의 연결 상세한 정보를 저장합니다.
이 파일은 무시됩니다.🙈 을 통해gitignore "그래서 우리 환매에 나타나지 않을 거예요.👆🏽).
VS 코드(또는 텍스트 편집기)에서 필요한 세부 정보를 붙여넣을 수 있습니다. 아래와 같이 관련 정보를 자신의 것으로 바꿀 수 있습니다.
# This will be used by express
PORT=8000
INSTANCE_URL=https://node-demo-codefinity.harperdbcloud.com
INSTANCE_USERNAME=codefinity
INSTANCE_PASSWORD=someSecretSpit
# What you entered as your schema name
INSTANCE_SCHEMA=dev
구성 탭에서 찾을 수 있습니다 npm
:
Express 서버
ExpressJS는 노드의 맨 위에 있는 중간부품 프레임워크로 루트 요청을 잘 관리합니다.설치합시다:
INSTANCE_URL
.우리는 또 필요로 한다.
npm i express
, 이렇게 하면 우리는 이것들을 얻을 수 있다.env'deets는 우리에게 전해준다npm i dotenv
.src/index의 내부입니다.js, 다음과 같이 기본 Express 서버를 설정합니다.
// 'import' works b/c of the webapack config 🤓
import express from "express";
// We are destructuring 'config' directly from 'dotenv
import { config } from "dotenv";
// Intialize stuff from '.env'
config();
const app = express();
// Configure 'Express' to receive URL encoded JSON
app.use(express.urlencoded({ extended: true }));
app.use(express.json());
// Set up a test route
app.get("/", (_, res) => {
res.end("Express Server");
});
// Start listening for requests on our 'secret port'
app.listen(process.env.PORT, () => {
console.log("Server 🏃🏽♂️", process.env.PORT);
});
Express Server 시작 및 라우팅 테스트
제가 전에 언급한'첫 번째 환매'👆🏽
express
및 webpack
를 사용하여 프로젝트의 변경 사항을 구축하고 관찰합니다.터미널 창에서 프로젝트 디렉토리로부터:
nodemon
.그리고 별도의 터미널 창에서: npm run watch
.우체부(또는 불면증자) 테스트 노선
지금 당신은 (또는 불면증) 이 필요합니다.
나는 Postman을 사용하여 우리의 간단한 획득 노선을 테스트할 것이다. 거기서 우리는 응답으로 돌아가야 한다.
npm run serve
."Express Server"
.노드 Harper 클라이언트 연결
노드 코드와 연결을 사용하는 커넥터가 필요합니다.env 는 HarperDB 인스턴스와 통신합니다.사용: Express Server
.
현재 데이터베이스/클라이언트 내부에 있습니다.우리는 실례에 대한 클라이언트 연결을 만들 것입니다.
import harperive from "harperive";
import { config } from "dotenv";
config();
// Pass in our deets to initialize and export the 'client'
export default new harperive.Client({
harperHost: process.env.INSTANCE_URL,
username: process.env.INSTANCE_USERNAME,
password: process.env.INSTANCE_PASSWORD,
// We only have 1 schema so we can set that directly
schema: process.env.INSTANCE_SCHEMA,
});
묵은 때 운행 컨트롤러
'db/색인.js는 데이터베이스를 직접 조작하는 업무 논리 컨트롤러를 포함할 것입니다.이것은 잠시 후에 우리의'expressapi'에서 사용할 것입니다. 이api는 전송된 요청에 따라 정확한 컨트롤러를 호출합니다. 이것은'기본'RESTfulapi의 본질입니다.
우리는 한 번에 하나의 큰 덩어리의 필요 코드만 토론할 것이다. 그리고 나는 당신이 내가 왜 이렇게 코드를 설정하는지 이유를 이해하도록 인도할 것이다.
각 CRUD 컨트롤러에 필요한 패킷 콜백 모드부터 시작합니다.그 중 하나를 실행할 때마다 오류를 처리하거나 Harper의 성공적인 응답을 처리해야 하기 때문이다.
좀 복잡해요.근데 코드를 닦아도 돼요.
const callback = (func) => (err, res) => {
if (err) {
func(err);
} else {
func(null, res);
}
};
우리가 만들 각 CRUD 작업npm i harperive
, add
및 search
에 대해 오류 - delete
또는 HarperDB의 성공적인 응답 - err
에 응답하기 위해 콜백 함수를 실행하고자 합니다.res
우리가 사용하고자 하는 모든 함수를 사용할 수 있는 리셋을 만들 수 있습니다.(func) => (err, res) => {
는 오류를 우리의 함수에 전달하고, if (err)
은'오류'를 else
로 발송하며, 이렇게 하면 우리는'성공 응답'null
으로 계속 일을 할 수 있다.
우리가 진정으로 그것을 사용할 때, 이것은 더욱 의미가 있을 것이다.
"db/index"를 계속합니다.js’:
res 사용🤗
import client from "./client";
// TODO: 'const callback' code block goes here.
// Export out all of our 'controller methods'
export default {
/**
* Insert 1 game at a time only (for simplicity)
* title - the game title as a string
* platform - the game platform as a string
* cb - the function that will handle error/success
*/
add(title, platform, cb) {
// TODO: 'insert' a new video game
},
// 'searchParams' is an Object with 'search parameters.'
search(searchParams, cb) {
// TODO: Search using either a hash/id or a value.
},
// 'id' is a string
delete(id, cb) {
// TODO: Seek and destroy 🎸 using the given 'id'
},
};
컨트롤러 방법Guts
다음은 컨트롤러 방법마다'용기'를 삽입하고 교체client
s👆🏽, TODO
부터:
client.insert(
{
// We'll hardcode this b/c we only have 1
table: "games",
// 'records' MUST be an Array (even if only 1)
records: [{
// Object shorthand technique
title, platform }] },
// What to do when done?
callback(cb)
);
메모🎵 즉, add
👆🏽 여기에서 우리는 초기의 callback(cb)
패키지를 사용하여 중복 코드를 저장한다👆🏽.
다음으로, 우리는, const callback
있다.이것은 좀 복잡하다. b/c만 인코딩해야 한다. 이렇게 하면 우리가 하나search
를 전송할 때 searchByHash
로 처리할 수 있다🔑, 또는id
, 만약searchByValues
또는game
🔑.
// Check for an 'id' via OBJECT DESTRUCTURING
const { id } = searchParams;
if (id) {
client.searchByHash(
{
table: "games",
hashValues:
// ⚠️ MUST be wrapped in an ARRAY
[id],
// Only send back 'title'
attributes: ["title"],
},
callback(cb)
);
}
// We must be searching by something other than 'id'
else {
// Use array destructuring to pull out our 🔑 and value
const [searchParamsEntry] = Object.entries(searchParams);
client.searchByValue(
{
table: "games",
// This is the 🔑 - 'title' or 'platform'
searchAttribute: searchParamsEntry[0],
searchValue: searchParamsEntry[1],
// Send back all of the details
attributes: ["*"],
},
callback(cb)
);
}
마지막으로 우리는 platform
(좀 간단하다😌):
client.delete(
{
table: "games",
// Again, the 'id' must be wrapped in an Array
hashValues: [id],
},
callback(cb)
);
빠른 라우터
이제 컨트롤러는 괜찮아요.💦, 우리는api 루트를 쉽게 만들 수 있습니다. 이렇게 하면 테스트를 진행할 수 있습니다.
import { Router } from "express";
// Controller methods
import db from "db";
// Express router
const router = new Router();
// POST method to '/games/add/'
router.post("/add", (
// Destructure 'title' and 'platform' from request
{ body: { title, platform } }, res, next) => {
db.add(title, platform,
// Callback handler
(err, dbRes) => {
if (err) {
// 'Standard' Express 'built-in' error handling
next(
new Error(`
❗Error adding ➕
${err.error}
`)
);
}
res.status(201);
res.json(dbRes);
});
});
// POST method to '/games/search'
router.post("/search", (
// Destructure 'body' from request
{ body }, res, next) => {
db.search(body, (err, dbRes) => {
if (err) {
next(
new Error(`
❗Error searching 🔍
${err.error}
`)
);
}
res.status(200);
res.json(dbRes);
});
});
// 'DELETE' method to '/games'
router.delete("/", ({ body: { id } }, res, next) => {
db.delete(id, (err, dbRes) => {
if (err) {
next(
new Error(`
❗Error deleting 🔥
${err.error}
`)
);
}
res.status(204);
res.json(dbRes);
});
});
// Send the 'router' back out for the server to use
export default router;
서버에서 사용할 수 있습니다delete
.다음은 파일의 모양입니다.👀 시작 코드와 마찬가지로 추가router
(삭제했습니다.🔥 원래 "테스트router
"코드:
import express from "express";
import { config } from "dotenv";
// Router
import api from "api";
config();
const app = express();
app.use(express.urlencoded({ extended: true }));
app.use(express.json());
// Trigger our Express JSON Router if URL ends with '/games'
app.use("/games", api);
app.listen(process.env.PORT, () => {
console.log("Server 🏃🏽♂️", process.env.PORT);
});
매사를 시험하다🇮🇳
서버가 여전히🏃🏽♂️, 마지막으로, 우리는 우체부에서 우리의 노선을 테스트할 수 있다.
'
'- 가져오기
import harperive from "harperive";
import { config } from "dotenv";
config();
// Pass in our deets to initialize and export the 'client'
export default new harperive.Client({
harperHost: process.env.INSTANCE_URL,
username: process.env.INSTANCE_USERNAME,
password: process.env.INSTANCE_PASSWORD,
// We only have 1 schema so we can set that directly
schema: process.env.INSTANCE_SCHEMA,
});
const callback = (func) => (err, res) => {
if (err) {
func(err);
} else {
func(null, res);
}
};
import client from "./client";
// TODO: 'const callback' code block goes here.
// Export out all of our 'controller methods'
export default {
/**
* Insert 1 game at a time only (for simplicity)
* title - the game title as a string
* platform - the game platform as a string
* cb - the function that will handle error/success
*/
add(title, platform, cb) {
// TODO: 'insert' a new video game
},
// 'searchParams' is an Object with 'search parameters.'
search(searchParams, cb) {
// TODO: Search using either a hash/id or a value.
},
// 'id' is a string
delete(id, cb) {
// TODO: Seek and destroy 🎸 using the given 'id'
},
};
client.insert(
{
// We'll hardcode this b/c we only have 1
table: "games",
// 'records' MUST be an Array (even if only 1)
records: [{
// Object shorthand technique
title, platform }] },
// What to do when done?
callback(cb)
);
// Check for an 'id' via OBJECT DESTRUCTURING
const { id } = searchParams;
if (id) {
client.searchByHash(
{
table: "games",
hashValues:
// ⚠️ MUST be wrapped in an ARRAY
[id],
// Only send back 'title'
attributes: ["title"],
},
callback(cb)
);
}
// We must be searching by something other than 'id'
else {
// Use array destructuring to pull out our 🔑 and value
const [searchParamsEntry] = Object.entries(searchParams);
client.searchByValue(
{
table: "games",
// This is the 🔑 - 'title' or 'platform'
searchAttribute: searchParamsEntry[0],
searchValue: searchParamsEntry[1],
// Send back all of the details
attributes: ["*"],
},
callback(cb)
);
}
client.delete(
{
table: "games",
// Again, the 'id' must be wrapped in an Array
hashValues: [id],
},
callback(cb)
);
import { Router } from "express";
// Controller methods
import db from "db";
// Express router
const router = new Router();
// POST method to '/games/add/'
router.post("/add", (
// Destructure 'title' and 'platform' from request
{ body: { title, platform } }, res, next) => {
db.add(title, platform,
// Callback handler
(err, dbRes) => {
if (err) {
// 'Standard' Express 'built-in' error handling
next(
new Error(`
❗Error adding ➕
${err.error}
`)
);
}
res.status(201);
res.json(dbRes);
});
});
// POST method to '/games/search'
router.post("/search", (
// Destructure 'body' from request
{ body }, res, next) => {
db.search(body, (err, dbRes) => {
if (err) {
next(
new Error(`
❗Error searching 🔍
${err.error}
`)
);
}
res.status(200);
res.json(dbRes);
});
});
// 'DELETE' method to '/games'
router.delete("/", ({ body: { id } }, res, next) => {
db.delete(id, (err, dbRes) => {
if (err) {
next(
new Error(`
❗Error deleting 🔥
${err.error}
`)
);
}
res.status(204);
res.json(dbRes);
});
});
// Send the 'router' back out for the server to use
export default router;
import express from "express";
import { config } from "dotenv";
// Router
import api from "api";
config();
const app = express();
app.use(express.urlencoded({ extended: true }));
app.use(express.json());
// Trigger our Express JSON Router if URL ends with '/games'
app.use("/games", api);
app.listen(process.env.PORT, () => {
console.log("Server 🏃🏽♂️", process.env.PORT);
});
그런 다음 Harper에서 찾아보기를 클릭하여 결과를 봅니다.
' '
우선 테스트해 봅시다
insert
.HarperDB에서 "id"를 가져옵니다.항목을 클릭한 다음 다음 화면에서 복사하기만 하면 됩니다.
http://localhost:8000/games/search
이전과 같은 Postman 절차에 따라 "POST"요청을 만들고 HarperDB에서 복사한 id로 JSON을 보냅니다.예:
{
"id": "47ecf929-405b-49d6-bd41-91e6b2c5ab48"
}
완료 중
🆗 다른 "POST"검색을 테스트하여 searchByHash
또는 "title"
JSON으로 보내도록 하겠습니다.
"DELETE"에 대해 생각해 보면, 우리의"platform"
는 이러한 "DELETE"요청을 수락하도록 설정되어 있습니다. router
삭제 요청이 생성되고 router.delete("/"
를 사용하여 "
"로 다시 전송됩니다.
나는 다시 시작하려고 시도했다.문제는 제가 영상을 만드는 게 좀 싫은데 (특히 편집)!😃
이 강좌의 동영상 버전을 원하십니까?💦 만약 충분한 대답이 있다면, 아마도 나는 이를 드러내고 웃을 것이다😀 화목하다🐻 그것
Reference
이 문제에 관하여(노드 HarperDB REST API), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://dev.to/codefinity/node-harperdb-rest-api-19kb
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(노드 HarperDB REST API), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/codefinity/node-harperdb-rest-api-19kb텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)