내가 어떻게 노드에 다세입자 SaaS 제품을 구축했는지.js
다세입자 체계 구조는 일종의 소프트웨어 체계 구조로 그 중의 한 소프트웨어 실례는 여러 사용자 그룹에 서비스를 제공할 수 있다.이들 사용자 그룹을 임차인이라고 부른다.
한 세입자 중,
다세입자의 유형
세입자 데이터를 분리할 때 두 가지 주요한 다세입자 체계 구조 모델이 있다
Knex.js
Knexofficial website에 따르면.js는PostgreSQL,CockroachDB,MSSQL,MySQL,MariaDB,SQLite3,Better-SQLite3,Oracle과Amazon의 빨간색 이동에 사용되는'전지식'SQL 조회 생성기로서 디자인이 유연하고 이식이 가능하며 사용이 재미있다.
이제 Node에서 이 문제를 해결하기 위해 다세입자 체계 구조를 구축합시다.js.아래의 예에서 우리는 하나의 데이터베이스에서 모든 세입자의 방법에 대해 서로 다른 표를 사용할 것이다.
예비 지식
설치 프로그램
새 폴더를 만들고 노드를 초기화합니다.CLI에서 다음 명령을 입력하여
package.json
파일을 생성합니다.$ npm init -y
express
, knex
및 pg
패키지를 설치합니다.(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.js
knex
기능을 사용하여 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. 기본 서버 설정
색인js
require()
함수를 사용하여 프로그램에서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
테이블을 만듭니다.tenants
표에 삽입하고 세입자의 사용자를 위해 users
표를 만들고 접두사는 하위 도메인 이름tenantname_users
이다.를 사용하여 POST 요청 라우팅 만들기
/create-tenant
post()
대상의 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-user
post()
대상의 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
크레디트
Reference
이 문제에 관하여(내가 어떻게 노드에 다세입자 SaaS 제품을 구축했는지.js), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/cod3kid/how-i-built-a-multi-tenant-saas-product-in-nodejs-3m0b텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)