Nodejs datastack - 基于koa的RESTful框架

Nodejs datastack - 基于koa的RESTful框架

项目地址: https://github.com/RobinQu/datastack

对开发者友好的轻量级RESTful中间件,基于koa。 我会陆续放出一下tutorials,这篇文章纯属datastack 101,希望勾起大家的兴趣。

TL;DR

var datastack = require("datastack"),
    koa = require("koa");

var app = koa(); datastack(app, { storage: { type: “mongodb”, uri: “mongodb://127.0.0.1:27017/zoo” } }); app.resource(“cats”); app.resource(“dogs”); app.listen(porcess.env.PORT || 8888);

More fun

Events subscription

https://github.com/RobinQu/datastack/blob/master/spec/ws_subscription_spec.js

datastack自带的组件即可实现将事件的CRUD操作通过广播,在客户端:

var client = new Websocket("ws://localhost:8888/books/_subscription");
client.on("message", function(data) {
//json encoded string
var event = JSON.parse(data);
// event.type === "datastack:create"
// event.data === `storeKey`s of created records
});

通过datastack的notifier体系,可以轻松接驳Apple APN、Google Push Service,或者其他的sass服务(Mailgun、Urban Airship等),让你快速实现简洁的消息体系。

Data store

默认是利用mongo的,但相信不是每个人都喜欢mongo。事实上,通过实现自己的Storage类,你可以接入任何持久化方案。

例如,为测试而写的MemoryStore: https://github.com/RobinQu/datastack/tree/master/src/storage/memory

只需在创建datastack时给定storage属性,

var koa = require("koa"),
      datastack = require("datastack"),
      MySuperStorage = require("my-super-storage");

var app = koa(); datastack(app, { storage: new MySuperStorage() });

StackApp

尽管datastack中大部分的组件都可以利用mixin的方式应用到原生的koa应用实例上,我们也提供一个koa的子类StackApp,它有如下优势:

  1. 更多API shortcut
  2. 提供对cluster的一些支持(事件消息传播等)
  3. 代码会更简洁

一个简单的例子:

var datastack = require("datastack");
var app = datastack.app({
  storage: {
    type: "mongodb",
    uri: "mongodb://127.0.0.1:27017/datastack-test"
  }
});
app.resource("book");
app.resource("author");
var port = process.env.PORT || 8888;
app.listen(port, function() {
  console.log("server is up and running");
});

StackCluster

这是一个基于recluster 的封装。假如用到了datastack中的一些高级功能(事件订阅)等,不可避免的涉及到事件在cluster之间同步等问题。而集群之间的问题,远远不止这一个。StackCluster是为了解决这些目前我碰到的一些问题,以及未来架构中可能出现的问题而准备的,推荐使用。

一个完整的例子: https://github.com/RobinQu/datastack/tree/master/example/cluster

项目状况

其实在koa出来之后就在计划这个,但是写的好没动力。目前大部分架构已完成,现在的任务:

  1. 写更多的测试
  2. 更多的存储方案(redis, mysql, 以及混合存储,即多级缓存)
  3. 安全认证, 目前仅有有BasicAuth方案
  4. 消息通讯 4.1 更多渠道(APN、mail) 4.2 更多底层通讯方式 (zmq, AMQ)

datastack已经在我的个人项目中使用,但数量级还不够证明它的稳定性。

贡献

当然是越多越好了,datastack里面已经有很多打开的issues了。


4 回复

Nodejs datastack – 基于koa的RESTful框架

项目地址:

简介:

datastack 是一个轻量级的 RESTful 中间件,基于 Koa 框架。它旨在为开发者提供一种简单的方式来构建 RESTful API,并且内置了一些强大的功能,如事件订阅和数据存储。

TL;DR 示例代码:

var datastack = require("datastack"),
    koa = require("koa");

var app = koa();
datastack(app, {
  storage: {
    type: "mongodb",
    uri: "mongodb://127.0.0.1:27017/zoo"
  }
});
app.resource("cats");
app.resource("dogs");
app.listen(process.env.PORT || 8888);

这段代码展示了如何初始化一个 Koa 应用,并将其与 datastack 集成。我们配置了 MongoDB 作为存储引擎,并注册了两个资源 catsdogs。最后,启动服务器监听端口。

更多功能 - 事件订阅:

datastack 提供了事件订阅功能,允许你在客户端实时接收 CRUD 操作的通知。示例如下:

var client = new WebSocket("ws://localhost:8888/books/_subscription");
client.on("message", function(data) {
  // 解析接收到的消息
  var event = JSON.parse(data);
  // 检查事件类型
  if (event.type === "datastack:create") {
    console.log("新记录已创建:", event.data);
  }
});

这段代码展示了如何通过 WebSocket 订阅书籍资源的事件,并处理新创建的记录通知。

数据存储:

默认情况下,datastack 使用 MongoDB 作为存储引擎。如果你需要使用其他存储方案,可以通过实现自定义的 Storage 类来接入。例如,使用内存存储(MemoryStore):

var koa = require("koa"),
    datastack = require("datastack"),
    MemoryStore = require("my-super-storage");

var app = koa();
datastack(app, { storage: new MemoryStore() });

StackApp:

除了直接使用 datastack 初始化 Koa 应用外,还可以使用 StackApp 子类,它提供了更多的便捷方法和功能:

var datastack = require("datastack");
var app = datastack.app({
  storage: {
    type: "mongodb",
    uri: "mongodb://127.0.0.1:27017/datastack-test"
  }
});
app.resource("book");
app.resource("author");
var port = process.env.PORT || 8888;
app.listen(port, function() {
  console.log("server is up and running");
});

StackCluster:

对于需要处理集群环境的应用,可以使用 StackCluster,它基于 recluster 进行封装,能够更好地管理集群中的事件同步和其他问题。

项目状况:

目前,datastack 已经具备了基本的功能,并在我的个人项目中得到应用。接下来的任务包括增加更多测试、扩展存储方案(如 Redis、MySQL)、完善安全认证和消息通信功能。

贡献:

非常欢迎贡献代码或提出 issue 来帮助改进 datastack。


赞一个 好像依赖好多

Nodejs datastack – 基于koa的RESTful框架

项目地址: datastack

简介: datastack 是一个基于koa的轻量级RESTful中间件框架。它提供了多种特性,如事件订阅、数据存储、多节点支持等,使得开发RESTful API变得更加便捷。

示例代码

下面是一个简单的示例,展示了如何使用datastack创建一个基于koa的应用,并添加资源(resource):

const datastack = require("datastack");
const Koa = require("koa");

const app = new Koa();

// 配置datastack使用MongoDB作为数据存储
datastack(app, {
  storage: {
    type: "mongodb",
    uri: "mongodb://127.0.0.1:27017/mydatabase"
  }
});

// 添加资源
app.resource("cats");
app.resource("dogs");

// 启动服务器
const port = process.env.PORT || 8888;
app.listen(port, () => {
  console.log(`Server is running on port ${port}`);
});

更多功能

  1. 事件订阅

    • datastack 支持事件订阅功能,可以通过WebSocket接收数据库操作的实时更新。客户端代码示例如下:

      const WebSocket = require('ws');
      const ws = new WebSocket('ws://localhost:8888/cats/_subscription');
      
      ws.on('message', (data) => {
        const event = JSON.parse(data);
        if (event.type === 'datastack:create') {
          console.log('New cat created:', event.data);
        }
      });
      
  2. 自定义数据存储

    • 如果不使用默认的MongoDB,可以通过实现自己的存储类来连接其他数据源。例如,使用Redis作为存储:

      const datastack = require("datastack");
      const Koa = require("koa");
      const RedisStore = require("./path/to/redis-store");
      
      const app = new Koa();
      datastack(app, { storage: new RedisStore() });
      
      app.resource("books");
      app.resource("authors");
      
      const port = process.env.PORT || 8888;
      app.listen(port, () => {
        console.log(`Server is running on port ${port}`);
      });
      
  3. StackApp 子类

    • datastack 提供了一个koa子类 StackApp,它提供了更多的API快捷方式和集群支持。

      const datastack = require("datastack");
      
      const app = datastack.app({
        storage: {
          type: "mongodb",
          uri: "mongodb://127.0.0.1:27017/mydatabase"
        }
      });
      
      app.resource("book");
      app.resource("author");
      
      const port = process.env.PORT || 8888;
      app.listen(port, () => {
        console.log(`Server is running on port ${port}`);
      });
      

项目状态

  • 当前datastack正在不断完善中,包括增加更多的存储选项、安全性增强和消息通信支持。
  • 项目已在作者的个人项目中使用,但还需要更多的测试和验证以确保稳定性和可靠性。

贡献

  • 欢迎大家参与贡献,提出问题和建议,帮助完善datastack

以上是关于datastack的基本介绍和使用方法,希望能帮助你快速上手。

回到顶部