애플리케이션을 개발 중이고 Couchbase에 파일을 저장하려고 합니다. 현재 Couchbase에서는 생각보다 큰 20MB 크기의 문서까지 저장할 수 있습니다. 왜 파일 시스템이 아닌 Couchbase에 파일을 저장해야 할까요? 애플리케이션 파일 시스템에 저장 공간이 충분하지 않거나, 더 나은 방법으로 Couchbase가 제공하는 복제 기능을 활용하여 소중한 데이터를 잃어버릴 위험이 없도록 하고 싶을 수도 있습니다.
파일 업로드를 수락하고, 베이스64 문자열로 변환한 다음, 필요한 메타데이터와 함께 문자열을 Couchbase에 저장하는 방법을 살펴보겠습니다.
카우치베이스 설정하기
여기서는 Couchbase Server를 NoSQL 데이터베이스로 선택합니다. 문서 데이터베이스이기 때문에 자바스크립트 객체를 저장하는 것이 완벽합니다.
아직 Couchbase Server 4.1 이상 버전이 없는 경우, 다음 페이지로 이동하여 다운로드 섹션에서 플랫폼 요구 사항(Mac, Linux, Windows)에 맞는 바이너리를 가져옵니다.
Couchbase를 설치한 상태에서 N1QL 쿼리 언어를 사용할 수 있도록 무언가를 추가해야 합니다. 기본 인덱스를 추가해야 합니다. 이 작업은 Couchbase 쿼리(CBQ) 클라이언트를 사용하여 수행할 수 있습니다.
Mac의 경우 터미널에서 다음을 실행하여 CBQ를 시작합니다:
|
1 2 3 |
./애플리케이션/카우치베이스 서버.앱/콘텐츠/리소스/카우치베이스-핵심/bin/cbq |
Microsoft Windows에서는 다음을 실행하여 동일한 작업을 수행할 수 있습니다:
|
1 2 3 |
C:/프로그램 파일/카우치베이스/서버/bin/cbq.exe |
CBQ를 사용해 본 적이 없다면 MySQL 명령줄 도구나 Oracle의 SQLPlus와 매우 유사하다는 것을 알게 될 것입니다. 무엇보다도 이 도구로 쿼리를 실행할 수 있습니다. 우리가 실행할 쿼리는 기본 인덱스를 생성합니다. 다음을 실행합니다:
|
1 2 3 |
만들기 기본 INDEX 켜기 `기본값` 사용 GSI; |
이제 Couchbase Server를 Node.js 애플리케이션과 함께 사용할 수 있습니다.
기본 Node.js 애플리케이션 구성하기
여기에서 볼 수 있는 대부분의 내용은 제가 이 주제에 대해 작성한 두 개의 다른 튜토리얼에서 가져온 것입니다. 저는 예전에 Angular 2 애플리케이션을 통한 Node.js 파일 업로드뿐만 아니라 해당 파일을 Base64 데이터로 변환하는 방법. 이번에는 Couchbase Server에 base64 데이터를 삽입하겠습니다.
먼저 새로운 Node.js 프로젝트를 만들어 봅시다. 이 프로젝트에는 프론트엔드가 없지만 직접 만들거나 Postman과 같은 도구를 사용하여 테스트할 수 있습니다. 프로젝트에는 다음과 같은 파일과 디렉터리가 있어야 합니다:
|
1 2 3 4 5 |
업로드/ 구성.json 앱.js |
터미널(Mac 및 Linux) 또는 명령 프롬프트(Windows)를 사용하여 프로젝트 디렉토리 내에서 다음을 실행합니다:
|
1 2 3 |
npm init -y |
위의 명령은 새 package.json 파일을 만듭니다. 이제 프로젝트 종속 요소를 설치해야 합니다. 명령 프롬프트 또는 터미널에서 다음을 실행하여 설치할 수 있습니다:
|
1 2 3 |
npm 설치 카우치베이스 express uuid body-파서 뮬터 --저장 |
이제 작은 Node.js 애플리케이션 개발을 시작할 수 있습니다. 아주 간단하게 만들겠습니다. 애플리케이션의 config.json 파일에는 Couchbase 노드에 대한 다음 정보가 포함됩니다:
|
1 2 3 4 5 6 7 8 |
{ "couchbase": { "서버": "127.0.0.1:8091", "bucket": "default" } } |
이렇게 하면 프로젝트 전체에서 서버 정보를 하드코딩하지 않아도 됩니다.
이제 핵심 Node.js 로직 파일인 app.js 파일을 만듭니다. 다음 코드를 추가합니다:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
var express = require("express"); var bodyParser = require("body-parser"); var 뮬터 = require("multer"); var fs = require("fs"); var 앱 = express(); 앱.사용(bodyParser.json()); 앱.사용(bodyParser.urlencoded({ 확장: true })); 앱.사용(함수(req, res, 다음) { res.헤더("액세스 제어-허용-오리진", "*"); res.헤더("액세스 제어-허용-헤더", "원본, X-요청-함께, 콘텐츠 유형, 수락"); 다음(); }); 앱.post("/업로드", 뮬터({dest: "./업로드/"}).배열("업로드", 12), 함수(req, res) { var fileInfo = []; 에 대한(var i = 0; i < req.파일.길이; i++) { fileInfo.push({ "원래 이름": req.파일[i].원래 이름, "크기": req.파일[i].크기, "b64": new 버퍼(fs.readFileSync(req.파일[i].경로)).toString("base64") }); fs.링크 해제(req.파일[i].경로); } res.보내기(fileInfo); }); var 서버 = 앱.듣기(3000, 함수() { 콘솔.로그("듣기 on 포트 %s...", 서버.주소().포트); }); |
당신은 실제로 내가 중단 한 부분을 따라 잡았습니다. Node.js base64 변환 튜토리얼. 문제는 이제 그 데이터를 Couchbase Server에 저장하고 싶다는 것입니다.
N1QL 쿼리를 통해 카우치베이스에 파일 데이터 삽입하기
이전 단계에서 다운로드한 다양한 종속성 정보를 포함시키는 것부터 시작하겠습니다. 상단의 app.js 파일에 다른 가져오기 파일과 함께 다음을 포함하세요:
|
1 2 3 4 5 6 |
var 카우치베이스 = require("couchbase"); var N1qlQuery = require('카우치베이스').N1qlQuery; var uuid = require("uuid"); var 구성 = require("./config"); |
여기에는 Couchbase, N1QL 엔진, 서버 정보, 고유 값 생성을 위한 라이브러리가 포함됩니다. 이제 교차 출처 리소스 공유를 위한 코드 블록 앞 또는 위에 다음 줄을 추가합니다:
|
1 2 3 |
var 버킷 = (new 카우치베이스.클러스터(구성.카우치베이스.서버)).오픈버킷(구성.카우치베이스.버킷); |
앞서 말했듯이 어디에 두는지는 중요하지 않지만 이 라인은 Couchbase 클러스터에 연결되고 버킷을 열게 되며, 둘 다 우리가 정의한 config.json 파일을 만듭니다.
이제 맛있게 먹을 시간입니다!
데이터를 사용자에게 다시 반환하기 전에 Couchbase에 저장하도록 업로드의 엔드포인트 함수를 변경하겠습니다. 엔드포인트 함수를 다음과 같이 변경합니다:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
앱.post("/업로드", 뮬터({dest: "./업로드/"}).배열("업로드", 12), 함수(req, res) { var fileInfo = []; 에 대한(var i = 0; i < req.파일.길이; i++) { fileInfo.push({ "원래 이름": req.파일[i].원래 이름, "크기": req.파일[i].크기, "b64": new 버퍼(fs.readFileSync(req.파일[i].경로)).toString("base64") }); fs.링크 해제(req.파일[i].경로); } var 문 = "삽입 INTO `" + 구성.카우치베이스.버킷 + "` (KEY,VALUE) 가치 " + "($1, {&apos;파일&apos;: $2})"; var 쿼리 = N1qlQuery.fromString(문); 버킷.쿼리(쿼리, [uuid.v4(), fileInfo], 함수(오류, 결과) { 만약(오류) { 반환 res.상태(400).보내기({"상태": "오류", "메시지": 오류}); } res.보내기(fileInfo); }); }); |
이제 우리는 이제 삽입 문을 사용하시나요? 이것은 모든 종류의 SQL 인젝션 공격을 방지하기 위한 매개변수화된 쿼리입니다. 매개변수는 실제 쿼리에서 정의되며 키와 생성한 파일 배열에 대한 고유 ID 값입니다. 데이터가 저장된 후에만 사용자에게 반환됩니다.
결론
예, 실제 파일 업로드와 관련하여 약간의 손길이 필요했지만 이는 Couchbase에 삽입하는 것에 더 신경을 썼기 때문입니다. 또한 제 이전 튜토리얼. 여기서는 업로드된 모든 base64 파일이 포함된 배열을 삽입하기 위해 N1QL 쿼리를 수행하는 방법을 살펴보았습니다. 파일 크기가 Couchbase 제한을 초과하지 않는 한, 이 방법은 완벽하게 허용되는 솔루션이며 복제가 활성화된 경우 복제를 허용합니다.