노드 HarperDB REST API

34207 단어 nodedatabase

너무 길어서 읽을 수가 없어요.


Completed code repo using "books" instead of "games"

앞말


이 글은 단지'빠른 즉각적인 만족'을 위한 것이 아니다당신의 경험 수준에 따라 이 코드 중 일부는 이해하기 어려울 수도 있습니다. 왜냐하면 저는 이 과정에서 무미건조한 코드 모델과 모듈화 구조를 보여 주려고 하기 때문입니다.한번 보다👀 환매 시👆🏽 뭐 공부 해요?💡 계속하기 전에, 만약 당신이 좋아한다면, (그러나 복사/붙여넣지 마세요. - 이것은 배울 수 없습니다.)🙅🏽‍♂️)
  • 본문의 영감은 다음과 같습니다.



  • .ltag__ 사용자 id__399959.작업 버튼 따르기
    배경색: #403b8a!중요했어
    #fffff!중요했어
    테두리 색상: #403b8a!중요했어
    }

    마고 마카베


    On the innovative team @ HarperDB. Podcast host. Tech blogger. DevRel. Women in tech.
    Harper DB에서 온 그녀는 여기에서 Harper와 Node에 대한 배경 지식을 많이 소개했다.


  • 전체 인코딩을 위해 다음 사항을 확인해야 할 수 있습니다.


    This 'starter template repo' - 전체 코드 재구매 기준👆🏽 - webpack 대신 허용 import, 절대 가져오기, 스웨이드 및 일부 기본 이니시에이터를 위한 구성 포함🌱 건축학🏗️, 또 다른 좋은 것들이 있어요.🧁.
  • Node Harper 기능 외에도 ""을 사용할 예정입니다.env'는 패키지 모드,Postman과 현대 Ecmascript 코드 모드와 문법이다.
    본고의 나머지 부분은 당신이 사용하고 있거나 유사한 것을 가정할 것입니다.

    상술하다👆🏽 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 시작 및 라우팅 테스트


    제가 전에 언급한'첫 번째 환매'👆🏽 expresswebpack를 사용하여 프로젝트의 변경 사항을 구축하고 관찰합니다.
    터미널 창에서 프로젝트 디렉토리로부터: nodemon.그리고 별도의 터미널 창에서: npm run watch.

    우체부(또는 불면증자) 테스트 노선


    지금 당신은 (또는 불면증) 이 필요합니다.
    나는 Postman을 사용하여 우리의 간단한 획득 노선을 테스트할 것이다. 거기서 우리는 응답으로 돌아가야 한다. npm run serve.
  • 왼쪽의 새 모음을 클릭합니다.
  • 이름을 지정하고 클릭🍊 버튼
  • 클릭...그런 다음 요청 추가
  • 를 선택합니다.
  • 로컬 웹 서버는 "Postman"에서 실행됩니다.브라우저 표시줄처럼 보이는 큰 필드에 GET라는 단어를 입력합니다.
  • 파란색 보내기 버튼을 클릭하여 요청을 보내면 오른쪽에 있는 큰 공간에서 볼 수 있습니다 "Express Server".
  • http://localhost:8000

    노드 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, addsearch에 대해 오류 - 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


    다음은 컨트롤러 방법마다'용기'를 삽입하고 교체clients👆🏽, 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);
    });
    

    매사를 시험하다🇮🇳


    서버가 여전히🏃🏽‍♂️, 마지막으로, 우리는 우체부에서 우리의 노선을 테스트할 수 있다.

    ' '- 가져오기

  • GET를 POST로 전환
  • Body를 클릭합니다.
  • 원본 선택
  • 오른쪽에서 JSON을 선택합니다.
  • 유효한 JSON을 입력합니다.
  • 보내기 를 클릭합니다.
  • http://localhost:8000/games/add
    그런 다음 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("/" 를 사용하여 " "로 다시 전송됩니다.
    나는 다시 시작하려고 시도했다.문제는 제가 영상을 만드는 게 좀 싫은데 (특히 편집)!😃
    이 강좌의 동영상 버전을 원하십니까?💦 만약 충분한 대답이 있다면, 아마도 나는 이를 드러내고 웃을 것이다😀 화목하다🐻 그것

    좋은 웹페이지 즐겨찾기