멋진 커뮤니티 모듈

fib 앱

fibjs 애플리케이션 기본 API 프레임워크

설치

1
npm install fib-app [--save]

시험

1
npm test

기본 스크립트 작성

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
const http = require('http'); const util = require('util') const Session = require('fib-session') const App = require('../'); var app = new App('sqlite:test.db', { uuid: true }); app.db.use(require('./defs/person')); var session = new Session(new util.LruCache(20000), { timeout: 60 * 1000 }); var svr = new http.Server(8080, [ session.cookie_filter, { '/1.0': app } ]); svr.run();

여기서 person는 다음과 같은 모델 정의 모듈입니다.

1 2 3 4 5 6 7
module.exports = db => { db.define('person', { name: String, sex: ["male", "female"], age: Number }); };

이것은 표준 orm 정의이며 형식 검사, 이벤트 등과 같은 orm의 다른 기능도 사용할 수 있습니다.

API 데이터 형식

POST 및 PUT 요청의 경우 요청 본문은 JSON 형식이어야 하고 HTTP 헤더의 Content-Type은 application/json으로 설정해야 합니다.

1 2 3 4
curl -X PUT \ -H "Content-Type: application/json" \ -d '{"name": "tom","sex":"male","age":23}' \ http://localhost/1.0/person/57fbbdb0a2400000

모든 요청의 응답 형식은 JSON 개체입니다.

요청의 성공은 HTTP 상태 코드로 표시됩니다. 2XX 상태 코드는 성공을 나타내고 4XX는 요청 실패를 나타냅니다. 요청이 실패하면 응답 본문은 여전히 ​​JSON 개체이지만 디버깅에 사용할 수 있는 두 개의 코드 및 메시지 필드가 항상 포함됩니다. 예를 들어 권한 인증 요청이 실패하면 다음 정보가 반환됩니다.

1 2 3 4
{ "code": 4030501, "message": "The operation isn’t allowed for clients due to class-level permissions." }

코드는 세 부분으로 나뉩니다. 처음 세 자리 403은 오류 유형, 05는 데이터 테이블 번호, 01은 자세한 오류 코드를 나타냅니다.

GET 요청의 경우 일반적으로 객체 데이터가 반환되며 GET 요청의 주소에 따라 객체 또는 배열이 반환될 수 있습니다. 예를 들어:

1 2 3 4 5
{ "name": "tom", "sex": "male", "age": 23 }

또는:

1 2 3 4 5 6 7 8 9 10 11 12
[ { "name": "tom", "sex": "male", "age": 23 }, { "name": "lily", "sex": "female", "age": 22 } ]

특수분야

오브젝트 데이터에는 API를 통해 변경할 수 없는 특별한 의미를 가진 4개의 필드가 있습니다. 각각 id, updatedAt, createdAt, createdBy.

어디 id, updatedAt, createdAt개별 필드가 자동으로 생성되고 수정됩니다. createdBy유형을 직접 지정해야 합니다.

기본 개체 액세스 API

이 데이터 정의를 완료하면 REST API 사양을 준수하는 완전한 인터페이스 호출 세트가 직접 생성됩니다.

URL 방법 동작
/1.0/:클래스 이름 우편 새 개체 만들기
/1.0/:클래스 이름/:아이디 가져 오기 객체 읽기
/1.0/:클래스 이름/:아이디 놓다 개체 수정
/1.0/:클래스 이름/:아이디 삭제 개체 삭제
/1.0/:클래스 이름 가져 오기 쿼리 개체 목록

새 개체 만들기

새 객체를 생성하려면 객체 자체를 포함해야 하는 클래스의 URL로 POST 요청을 보내야 합니다. 예를 들어 위에서 언급한 대로 개체를 만들려면 다음을 수행합니다.

1 2 3 4
curl -X POST \ -H "Content-Type: application/json" \ -d '{"name": "tom","sex":"male","age":23}' \ http://localhost/1.0/person

생성에 성공하면 HTTP 응답은 201 Created이고 응답 본문은 새 객체의 objectId 및 createdAt 타임스탬프를 포함하는 JSON 객체입니다.

1 2 3 4
{ "createdAt": "2017-11-25T01:39:35.931Z", "id": "57fbbdb0a2400000" }

객체 읽기

객체를 생성할 때 반환된 헤더의 Location에 GET 요청을 전송하여 객체의 내용을 가져올 수 있습니다. 예를 들어 위에서 만든 개체를 가져오려면 다음을 수행합니다.

1
curl -X GET http://localhost/1.0/person/57fbbdb0a2400000

몸은 JSON 객체가 모든 사용자가 제공 한 필드와 함께 포함되어 반환 createdAt, updatedAtid필드 :

1 2 3 4 5 6 7 8
{ "name": "tom", "sex": "male", "age": 23, "createdAt": "2017-11-25T01:39:35.931Z", "updatedAt": "2017-11-25T01:39:35.931Z", "id": "57fbbdb0a2400000" }

를 제공하여 필드를 반환합니다 keys. 사용자 정의된 콘텐츠를 반환할 수 있습니다. keys콘텐츠는 ,분할된 필드 이름 문자열에 있습니다.

1
curl -X GET http://localhost/1.0/person/57fbbdb0a2400000?keys=name%2Csex

반환됩니다:

1 2 3 4
{ "name": "tom", "sex": "male" }

개체 수정

객체의 기존 데이터를 변경하기 위해 객체의 해당 URL로 PUT 요청을 보낼 수 있습니다.지정하지 않은 키는 변경되지 않으므로 객체 데이터의 하위 집합만 업데이트할 수 있습니다. 예를 들어 객체의 age 필드를 변경해 보겠습니다.

1 2 3 4
curl -X PUT \ -H "Content-Type: application/json" \ -d '{"age": 25}' \ http://localhost/1.0/person/57fbbdb0a2400000

JSON 반환 객체에는 한 번에 업데이트가 발생했음을 나타내는 updatedAtid필드 가 포함 됩니다.

1 2 3 4
{ "updatedAt": "2017-11-25T01:39:35.931Z", "id": "57fbbdb0a2400000" }

개체 삭제

객체를 삭제하기 위해 다음과 같이 지정된 객체의 URL로 DELETE 요청을 보낼 수 있습니다.

1
curl -X DELETE http://localhost/1.0/person/57fbbdb0a2400000

쿼리 개체 목록

클래스의 URL로 GET 요청을 보내면 URL 매개변수 없이 한 번에 여러 객체를 가져올 수 있습니다. 다음은 단순히 모든 사용자를 얻는 것입니다.

1
curl -X GET http://localhost/1.0/person

반환된 값은 결과 필드를 포함하는 JSON 개체이고 해당 값은 개체 목록입니다.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
[ { "name": "tom", "sex": "male", "age": 23, "createdAt": "2017-11-25T01:39:35.931Z", "updatedAt": "2017-11-25T01:39:35.931Z", "id": "57fbbdb0a2400000" }, { "name": "lily", "sex": "female", "age": 22, "createdAt": "2017-11-25T01:39:35.931Z", "updatedAt": "2017-11-25T01:39:35.931Z", "id": "57fbbdb0a2400001" } ]

키 필드 사용자 정의

개체 쿼리와 마찬가지로 쿼리 목록 keys사용자 정의 필드가 포함할 결과를 반환하도록 설정할 수 있습니다. keys내용은 ,필드 이름 문자열로 나누어져 있습니다. 예를 들면 다음과 같습니다.

1
curl -X GET http://localhost/1.0/person?keys=name%2Cage

지정된 반환만 nameage두 개의 필드입니다.

필터 조건

By where는 쿼리 개체에 대한 제약 조건을 매개 변수로 만들 수 있습니다.

where매개변수 값은 JSON으로 인코딩되어야 합니다. 즉, 실제로 보낸 URL 요청을 보면 먼저 JSON으로 인코딩한 다음 URL로 인코딩해야 합니다. where인수 로 사용하는 가장 쉬운 방법 은 적절한 키와 값을 포함하는 것입니다. 예를 들어 이름이 tom인 사용자를 검색하려면 다음과 같이 쿼리를 구성해야 합니다.

1
curl -X GET http://localhost/1.0/person?where=%7B%22name%22%3A%22tom%22%7D

where 값은 urlencode 뒤의 JSON 문자열이며 내용은 다음과 같습니다.{"name":"tom"}

주어진 값과 정확히 일치시키는 것 외에도 where포함과 같은 비교 방법도 지원됩니다. where매개변수는 다음 옵션을 지원합니다.

열쇠 작업 견본
EQ 동일한 {"이름":{"eq":"tom"}} 또는 {"이름":"tom"}
같지 않다 {"이름":{"네":"톰"}}
GT 이상 {"나이":{"gt":"24"}}
GTE 크거나 같음 {"나이":{"gte":"24"}}
미만 {"나이":{"lt":"24"}}
LTE 이하 {"나이":{"lt":"24"}}
처럼 퍼지 쿼리 {"이름":{"좋아요":"%m"}}
같지 않은 퍼지 쿼리 {"이름":{"not_like":"%m"}}
~ 사이 간격 비교 {"나이":{"사이에":[22,25]}}
~사이에 간격 비교 {"나이":{"not_between":[22,25]}}
~에 세다 {"이름":{"in":["tom","백합"]}}
not_in 세다 {"이름":{"not_in":["tom","백합"]}}
또는 OR 연산 {"또는":[{"이름":"톰"},{"나이":24}]}

건너뛰기 레코드 건너뛰기

하여 skip옵션, 당신은 플립 효과를 달성하기 위해, 건너 뛸 레코드의 수를 지정할 수 있습니다.

1
curl -X GET http://localhost/1.0/person?skip=100

제한은 레코드 제한을 반환합니다.

하여 limit옵션, 당신은 반환 된 레코드의 수를 제한 할 수 있습니다 limit100-1000 1에서 유효 숫자 및 기본값을.

1
curl -X GET http://localhost/1.0/person?limit=100

order는 정렬 방법을 지정합니다.

하여 order필드 이름 포함하기 전에 옵션을 설정, 결과 집합 정렬 돌아갑니다 -역 시간으로.

1
curl -X GET http://localhost/1.0/person?order=-id

count는 총 결과 수를 반환합니다.

count총 개수 를 늘리 도록 요청 하면 지정된 콘텐츠의 결과 집합을 동시에 반환할 수 있습니다.

1
curl -X GET http://localhost/1.0/person?count=1&limit=1

이 때 반환된 결과는 countresults두 개의 필드를 포함하며 각각은 총 결과 수를 포함합니다.

1 2 3 4 5 6 7 8 9 10 11 12 13
{ "count": 2, "results": [ { "name": "tom", "sex": "male", "age": 23, "createdAt": "2017-11-25T01:39:35.931Z", "updatedAt": "2017-11-25T01:39:35.931Z", "id": "57fbbdb0a2400000" } ] }

확장 개체 만들기

orm을 통해 hasOne과 hasMany를 정의하면 객체 간의 연관 관계를 정의하고 API에 반영할 수 있습니다. 예를 들면 다음과 같습니다.

1 2 3 4 5 6 7 8 9
module.exports = db => { var Person = db.models.person; var Pet = db.define('pet', { name: String }); Person.hasMany('pets', Pet); };

확장된 개체 액세스 API

다음은 확장 개체의 API 정의입니다.

URL 방법 동작
/1.0/:className/:id/:extendName 놓다 확장 개체 설정
/1.0/:className/:id/:extendName 우편 확장 개체 만들기
/1.0/:className/:id/:extendName/:rid 가져 오기 확장 객체 읽기
/1.0/:className/:id/:extendName/:rid 놓다 확장 개체 수정
/1.0/:className/:id/:extendName/:rid 삭제 확장 개체 삭제
/1.0/:className/:id/:extendName 가져 오기 확장 개체 목록 쿼리

확장 개체 설정

확장된 개체를 설정하는 것은 두 개의 독립된 개체 간에 연결을 설정하는 것입니다. 예를 들어 Tom은 고양이라는 이름의 애완동물을 입양했으며 다음 작업으로 달성할 수 있습니다.

1 2 3 4
curl -X PUT \ -H "Content-Type: application/json" \ -d '{"id": "57fbbdb0a2400007"}' \ http://localhost/1.0/person/57fbbdb0a2400000/pets

호출 시 본문에 cat 의 id를 지정해야 합니다.

확장 개체 만들기

확장된 객체를 직접 생성하여 객체를 생성하면서 객체 간의 연결을 설정할 수 있습니다. 예를 들어:

1 2 3 4
curl -X POST \ -H "Content-Type: application/json" \ -d '{"name": "cat"}' \ http://localhost/1.0/person/57fbbdb0a2400000/pets

고양이라는 이름의 애완 동물이 생성되고 Tom과의 연결 관계가 설정됩니다.

확장 객체 읽기

확장 개체 읽기는 기본 개체 읽기와 매우 유사하며 키 옵션도 지원합니다.

1
curl -X GET http://localhost/1.0/person/57fbbdb0a2400000/pets/57fbbdb0a2400007

확장 개체 수정

확장 개체를 읽는 것은 기본 개체를 읽는 것과 매우 유사합니다.

1 2 3 4
curl -X PUT \ -H "Content-Type: application/json" \ -d '{"name": "cat 1"}' \ http://localhost/1.0/person/57fbbdb0a2400000/pets/57fbbdb0a2400007

확장 개체 삭제

확장된 개체를 삭제해도 개체 자체는 삭제되지 않고 개체 간의 관계만 제거됩니다.

1
curl -X DETELE http://localhost/1.0/person/57fbbdb0a2400000/pets/57fbbdb0a2400007

확장 개체 목록 쿼리

확장 개체 목록 쿼리는 기본 개체 목록 쿼리와 매우 유사하며 키 및 조건부 필터링과 같은 옵션도 지원합니다.

1
curl -X GET http://localhost/1.0/person/57fbbdb0a2400000/pets

ACL

데이터 권한은 모델의 ACL을 정의하여 제어할 수 있습니다. 예를 들어:

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
const orm = require('fib-orm'); module.exports = db => { db.define('blog', { title: String, detail: Stringnote: String }, { ACL: function(session) { return { "*": { "*": false }, "57fbbdb0a2400000": { "*": true }, "roles": { "user": { "read": true } } }; } }); };

모델을 정의할 때 ACL을 지정하지 않으면 기본 권한을 설정하는 것과 같습니다.

1 2 3 4 5
{ "*": { "*": true } }

본체

이 세 가지 주요 ACL 설명, 사용자의 id, 사용자 role*, id특정 사용자를 대표하는 role사용자가 역할을 가지고 있음을 나타내는 *모든 사용자가 그 수단을 :

본체 설명하다 우선 순위
ID 특정 사용자의 ID 1
역할 사용자 그룹 이름 2
* 모두

권한을 확인할 때 첫 번째는 id해당 권한 과 일치 하고 지정되지 않은 경우 일치하는 사용자 role권한 과 일치 하여 지정된 *권한 *도 지정되지 않은 경우 권한이 없는지 확인합니다.

예를 들어, 위의 권한 구성은 user사용자 그룹이 읽을 수 있음을 지정 하고 사용자 57fbbdb0a2400000는 모든 권한을 갖는 반면 다른 사용자는 권한이 없습니다.

권한

ACL은 API 동작에 따라 5가지 유형의 권한을 분류합니다.

권한 설명하다 허용되는 유형
창조하다 개체 만들기 참/거짓/배열
읽다 객체 읽기 참/거짓/배열
쓰다 개체 수정 참/거짓/배열
삭제 개체 삭제 허위 사실
찾기 쿼리 개체 목록 허위 사실
* 모든 권한 일치 참/거짓/배열

true액세스를 허용하도록 개발된 권한은 지정된 액세스 필드만 허용하도록 액세스를 false금지 array합니다. delete그리고 find동의하지 않습니다 array를 설정하면, array다음으로 간주 true. 지정된 권한이 존재하지 않는 경우 다음은 주 *권한 과 일치합니다 . 존재하지 않는 경우 다음 우선순위의 주제를 다시 조회하십시오.

위 예의 예 user는 읽기만 허용 title하고 detail다른 것은 읽을 title수 있도록 설정해야 하는 경우 다음과 같이 설정할 수 있습니다.

1 2 3 4 5 6 7 8 9 10 11 12 13 14
{ "*": { "*": false, "read": ['title'] }, "57fbbdb0a2400000": { "*": true }, "roles": { "user": { "read": ['title', 'detail'] } } }

개체 권한

전체 클래스의 권한이 모델에 설정됩니다. 특정 개체에 대한 권한을 설정해야 하는 경우 OACL을 설정하여 다음을 달성할 수 있습니다.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
module.exports = db => { db.define('person', { name: String, sex: ["male", "female"], age: Number }, { ACL: function(session) { return { "*": { "*": false } } }, OACL: function(session) { var _acl = {}; if(this.id === session.id) _acl[session.id] = { "*": true }; return _acl; } }); };

이 예에서 방문자가 주체인 경우 모든 작업이 허용되고, 그렇지 않으면 모든 방문이 금지됩니다. 권한은 다음 단계에 따라 확인됩니다.

  • person[57fbbdb0a2400000] => OACL
  • person => ACL

확장된 개체 권한

확장 개체의 액세스 권한 제어는 기본 개체 권한과 유사하지만 ACL에서 별도로 지정해야 한다는 차이점만 있습니다.

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 34 35 36 37 38 39 40 41
module.exports = db => { var Person = db.define('person', { name: String, sex: ["male", "female"], age: Number },{ ACL: function(session) { return { "*": { "read": ['name', 'sex'], "extends": { "pets": { "read": true, "find": true } } } } }, OACL: function(session) { var _acl = {}; if(this.id === session.id) _acl[session.id] = { "*": true, "extends": { "pets": { "*": true } } }; return _acl; } }); var Pet = db.define('pet', { name: String }); Person.hasMany('pets', Pet); };

이 정의는 누구나 개인정보에 접근할 수 name있으며 sex, 자유롭게 접근하여 그를 검색 pets할 수 있으며, 나는 사용자가 자신의 모든 데이터를 운영할 수 있으며 자신의 애완동물 정보를 가질 수 있는 모든 권리를 가지고 있습니다.

확장 객체의 접근 권한을 확인할 때 객체 권한과 확장 객체 권한을 별도로 확인한다. 예를 들어 다음 요청:

1
curl -X GET http://localhost/1.0/person/57fbbdb0a2400000/pets/57fbbdb0a2400007

권한은 다음 단계에 따라 확인됩니다.

  • pets[57fbbdb0a2400007] => OACL
  • person[57fbbdb0a2400000]=> OACL=> extends=>pets
  • person=> ACL=> extends=>pets
  • pets => ACL

기능

Model에 대해 API를 정의할 수 있으며, Function을 사용자 지정하여 복잡한 데이터 작업을 완료할 수 있습니다.

대부분의 권한은 ACL로 제어할 수 있으며 개체 기반 권한을 완료하는 데 기능이 필요하지 않습니다. 기능을 사용하여 승인 상태에 따라 다른 사용자 그룹에 권한을 부여하는 등 데이터 기반 권한을 완료할 수 있습니다. 그리고 여러 데이터베이스 레코드를 수정해야 하는 것과 같은 여러 수정.

데이터 모델 그리기

데이터 정의가 완료된 후 app.diagram()데이터 모델 svg형식 클래스 다이어그램 을 그리는 데 사용할 수 있으며 파일은 다음과 유사한 이미지에 저장됩니다. 도표