내가 어떻게 노드에 다세입자 SaaS 제품을 구축했는지.js

몇 달 전에 나는 노드를 이용해서 URL 기반의 다세입자 SaaS 제품을 구축해야 했다.js.나는 그것이 무엇인지 모른다.그래서 구글에서'다세입자 체계 구조가 무엇인가','어떻게 노드js에서 다세입자 체계 구조를 구축하는가'등을 검색했다.불행하게도, 나는 많은 유용한 내용을 찾지 못했지만, 마지막에, 나는 Knex (/k ə ks/라고 발음) 를 발견했다. 이것은 강력한 SQL 조회 생성기이다.나는 이 기회를 빌려 관련되고 유용하다고 생각하는 사람들을 나누고 싶다.
다세입자 체계 구조는 일종의 소프트웨어 체계 구조로 그 중의 한 소프트웨어 실례는 여러 사용자 그룹에 서비스를 제공할 수 있다.이들 사용자 그룹을 임차인이라고 부른다.

한 세입자 중,
  • 단독 신청.
  • 독립 실행형 데이터베이스
  • 다세입자 중,
  • 동일한 신청
  • 독립 실행형 데이터베이스

  • 다세입자의 유형
    세입자 데이터를 분리할 때 두 가지 주요한 다세입자 체계 구조 모델이 있다
  • 임차인당 단일 데이터베이스
  • 단일 데이터베이스, 세입자마다 다른 표


  • Knex.js
    Knexofficial website에 따르면.js는PostgreSQL,CockroachDB,MSSQL,MySQL,MariaDB,SQLite3,Better-SQLite3,Oracle과Amazon의 빨간색 이동에 사용되는'전지식'SQL 조회 생성기로서 디자인이 유연하고 이식이 가능하며 사용이 재미있다.
    이제 Node에서 이 문제를 해결하기 위해 다세입자 체계 구조를 구축합시다.js.아래의 예에서 우리는 하나의 데이터베이스에서 모든 세입자의 방법에 대해 서로 다른 표를 사용할 것이다.

    예비 지식
  • 노드의 기초 지식.js와express library

  • 설치 프로그램
    새 폴더를 만들고 노드를 초기화합니다.CLI에서 다음 명령을 입력하여 package.json 파일을 생성합니다.
    $ npm init -y
    
    express, knexpg 패키지를 설치합니다.(pg는 Node.js의 PostgreSQL 클라이언트)
    $ npm install express knex pg
    
    루트 폴더에 index.js 파일을 만듭니다.이것은 응용 프로그램의 입구점이 될 것이다.

    데이터베이스 모드


    코드 해석

    Note: For ease of understanding, I'm not using best code practices



    1. Knex 구성db.js 파일을 만듭니다.데이터베이스에 연결하기 위해 Knex를 구성할 것입니다.
    db.jsknex 기능을 사용하여 require() 모듈을 가져옵니다.
    const knex = require("knex");
    
    Knex 모듈에서 내보낸 최상위 함수knex()를 호출합니다. 이 함수는 하나의 구성 객체를 수락하고 여러 매개변수를 수락합니다.
    const db = knex({
      client: "postgresql",
      connection: {
        database: "mutitenancy-node",
        user: "postgres",
        password: "postgres",
      },
    });
    
    응용 프로그램의 다른 곳에서 사용할 수 있도록 db 변수를 내보냅니다.
    module.exports = db;
    

    2. 기본 서버 설정
    색인jsrequire() 함수를 사용하여 프로그램에서express를 가져옵니다.
    const express = require("express");
    
    express 모듈에서 내보낸 최고급 함수 express() 를 호출합니다.
    const app = express()
    
    db.js 파일에서 기본 내보내기 기능 가져오기
    const knex = require("./db.js");
    
    express.json() 대상의 use() 방법을 사용하여 요청체의 JSON을 해석하기 위해 app 중간부품 함수를 불러옵니다.
    app.use(express.json());
    
    앱 대상listen() 방법으로 서버를 감청합니다.
    app.listen(4000, () => {
      console.log("Server listening to Port 4000");
    });
    

    3. 세입자 만들기
    마이그레이션하거나 다음 필드를 사용하여 수동으로 tenants 테이블을 만듭니다.
  • id-uuid
  • 이름 - 문자 변경
  • 하위 도메인 - 문자 변경
  • 관리자 e-메일 - 문자 변경
  • 새 세입자가 우리의SaaS 프로그램에 등록될 때마다 그들의 상세한 정보를 tenants표에 삽입하고 세입자의 사용자를 위해 users표를 만들고 접두사는 하위 도메인 이름tenantname_users이다.
    를 사용하여 POST 요청 라우팅 만들기/create-tenantpost() 대상의 app 방법.
    app.post('/create-tenant', async (req, res) => {
    
    
    })
    
    리셋 함수체 내부에서 요청체에서 name, subdomain, adminEmail 속성의 값을 가져옵니다.
    const { name, subdomain, adminEmail } = req.body;
    
    임차인의 상세한 정보를 tenants표에 삽입하다
    await knex("tenants").insert({
          name,
          subdomain,
          admin_email: adminEmail,
        });
    
    현재 세입자의 사용자를 위한 표를 만듭니다
    await knex.schema.createTable(`${subdomain}_users`, (table) => {
        table.uuid("id").defaultTo(knex.raw("uuid_generate_v4()"));
        table.string("first_name");
        table.string("last_name");
        table.string("email").unique();
      });
    
    send() 방법을 사용하여 응답을 클라이언트에게 보냅니다.
      res.send("Tenant Created");
    

    4. 삽입 users 테이블
    를 사용하여 POST 요청 라우팅 만들기/create-userpost() 대상의 app 방법.
    app.post('/create-user', async (req, res) => {
    
    
    })
    
    subdomains 대상의 req 그룹을 사용하여 요청 클라이언트의 하위 영역을 가져옵니다.
    const subdomain = req.subdomains[0];
    

    Note: To have a dynamic URL for each tenant, you might need to use Nginx with your frontend application.


    localhost를 사용하기 때문에 요청 주체로부터 하위 필드와 사용자의 상세한 정보를 얻습니다.
    const { firstName, lastName, email, subdomain } = req.body;
    
    사용자의 상세한 정보를 이 특정 세입자의 users 표에 삽입하다
    await knex(`${subdomain}_users`).insert({
        first_name: firstName,
        last_name: lastName,
        email,
      });
    
    send() 방법을 사용하여 응답을 클라이언트에게 보냅니다.
    res.send("User Created !!");
    

    마무리
    우리가 사용하는 것은 하나의 데이터베이스이기 때문에, 여러 명의 세입자의 요청은 시끄러운 이웃 효과를 초래하여 네트워크 성능 문제를 초래할 수 있다.
    전체 코드
    Github
    크레디트
  • Seo and web icons created by Anggara - Flaticon
  • User icons created by Freepik - Flaticon
  • Database icons created by Smashicons - Flaticon
  • 좋은 웹페이지 즐겨찾기