Skip to content

Commit

Permalink
feat(db-proxy): impl ejson for mongo;
Browse files Browse the repository at this point in the history
  • Loading branch information
maslow committed Oct 15, 2021
1 parent 3f8bc6d commit 52ef727
Show file tree
Hide file tree
Showing 3 changed files with 2,483 additions and 2,554 deletions.
92 changes: 25 additions & 67 deletions packages/database-proxy/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,72 +2,33 @@

## 介绍

`less-api` 是一个「超级API」,一个 API 替代服务端 90% 的传统 APIs。
`database-proxy` 是一个「超级API」,一个 API 替代服务端 90% 的传统 APIs。

通过一套「访问控制规则」配置数据库访问,让前端开发者“安全直连”数据库,再也不需要和服务端对接口了!

客户端使用 `less-api` 提供的 SDK,像在服务端操作数据库那样,在客户端直接读写相应的数据即可。
客户端使用 `laf-client-sdk` ,像在服务端操作数据库那样,在客户端直接读写相应的数据即可。

如果你了解微信小程序云开发,那么可以用 `less-api` 搭建自己的云开发。

`less-api` 可以让产品开发初期的时候, 投入极少(甚至0)服务端开发工作,随着业务的发展,
可以按需使用传统的 api 来部分代替,两者完全不冲突。

`less-api` 支持运行在自建服务器环境、腾讯云\阿里云云开发、unicloud、微信小程序云开发中。

在复杂架构的项目中, `less-api` 可以充当其中一个或多个微服务,承载部分数据操作请求。


## 谁适合使用 less-api ?

### 微信云开发用户

如果你喜欢微信云开发的极速开发体验,但又不想局限于微信平台,那么可以基于 less-api 搭建属于自己的云开发平台!

具体可了解 `less-framework` 和 `less-admin` (基于 less-api 实现的云开发框架和管理端)。

自建云开发,可以获取极速的云开发体验,同时没有技术选型时迁移平台的烦恼顾虑。

### 个人开发者、初创创业团队

无论你使用云开发还是自建服务器环境,在产品初期基于 `less-api` 可以极大减少服务端API的数量,
根据我们的实践经验,初期能节约 90% 的服务端API。

因此,在产品初期,团队可以专注于产品业务本身,快速推出最小可用产品(MVP),快速进行产品、市场验证。

随着业务的发展,可将部分复杂、性能、安全敏感的 API 用传统方式实现,`less-api` 继续承担一般的数据请求。

即便是应用重构,也可逐个替换原 `less-api` 负责的请求,重构过程不影响应用正常运行,持续发布的方式重构。


## 初心场景

>最初 `less-api` 就是出于以下场景而设计的:
- 用于快速开发 MVP,专注于客户端业务,极大程度减少服务端开发工作量
- 自建属于自己的云开发环境,具体可了解 `less-framework`(基于 less-api 实现的云开发框架)

## 使用示例
## 使用

```sh
npm install less-api
npm install database-proxy
```

### 服务端代码示例

```js
const app = require('express')()
const { Proxy, MongoAccessor, Policy } = require('less-api')
const { Proxy, MongoAccessor, Policy } = require('database-proxy')

app.use(express.json())

// design the access control policy rules
const rules = {
categories: {
"read": true,
"update": "$admin == true",
"add": "$admin == true",
"remove": "$admin == true"
"update": "!uid",
"add": "!uid",
"remove": "!uid"
}
}

Expand All @@ -82,17 +43,16 @@ policy.load(rules)
// create an proxy
const proxy = new Proxy(accessor, policy)

app.post('/entry', async (req, res) => {
const { role, uid } = parseToken(req.headers['authorization'])

// parse params
const params = proxy.parseParams(req.body)
app.post('/proxy', async (req, res) => {
const { uid } = parseToken(req.headers['authorization'])

const injections = {
$role: role,
$userid: uid
uid: uid
}

// parse params
const params = proxy.parseParams(req.body)

// validate query
const result = await proxy.validate(params, injections)
if (result.errors) {
Expand All @@ -116,35 +76,33 @@ app.listen(8080, () => console.log('listening on 8080'))
### 客户端使用

```sh
npm install less-api-client
npm install laf-client-sdk
```

```js
const cloud = require('less-api-client').init({
entryUrl: 'http://localhost:8080/entry',
getAccessToken: () => localStorage.getItem('access_token'),
environment: 'h5',
// environment: 'uniapp', // uniapp
// environment: 'wxmp' // 微信小程序
const cloud = require('laf-client-sdk').init({
dbProxyUrl: 'http://localhost:8080/proxy',
getAccessToken: () => localStorage.getItem('access_token')
})

const db = cloud.database()

// 查询文档
const cates = await db.collection('categories').get()
const res = await db.collection('categories').get()

// 条件查询
const articles = await db.collection('articles')
const res = await db.collection('articles')
.where({status: 'published'})
.orderBy({createdAt: 'asc'})
.offset(0)
.limit(20)
.get()

// 更新
const updated = await db.collection('articles').doc('the-doc-id').update({
title: 'new-title'
})
const res = await db.collection('articles')
.doc('the-doc-id').update({
title: 'new-title'
})
```

更多使用参考[客户端使用文档](./packages/less-api-client-js/README.md)
Expand Down Expand Up @@ -252,7 +210,7 @@ const updated = await db.collection('articles').doc('the-doc-id').update({

```sh
docker pull mongo
docker run -p 27017:27017 --name mongotest -d mongo
docker run --rm -p 27017:27017 --name mongotest -d mongo
```

执行测试用例
Expand Down
Loading

0 comments on commit 52ef727

Please sign in to comment.