V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ZackYang
V2EX  ›  Node.js

node-odata: 基于 NodeJS 的 REST 框架

  •  4
     
  •   ZackYang · 2015-01-13 16:01:02 +08:00 · 4174 次点击
    这是一个创建于 3638 天前的主题,其中的信息可能已经有所发展或是发生改变。

    关于 node-odata

    node-odata 可以让你轻松创建 REST API, 并能使用 OData 协议的格式进行数据的查询. 它让你可以更方便的创建 API 服务, 使你更专注于业务逻辑的处理.

    什么是 OData 协议?

    OData 全称开放数据协议(Open Data Protocol), 是一个用于 web 的数据访问协议. OData 提供了一个统一的 CRUD (create, read, update, and delete) 操作来查询和维护数据集.

    为什么使用 node-odata?

    node-odata 同时结合了 OData 强大的数据查询能力以及 NodeJS 高并发能力的优势, 使开发者能快速的创建一个高性能并支持各种复杂查询的 REST API.

    在常规的 REST 框架中, 仅仅提供了 REST 风格的 CRUD 操作. 开发者不的不对每一个资源都手动添加一些公共功能, 如排序/分页等, 甚至在复杂的业务场景中, 开发者不的不一次次根据业务需求制定一些特定的复杂查询, 这都极大的浪费了人力资源. OData数据访问协议很好的解决了这一问题. 它定义了$filter, $orderby, $select等一系列关键字来进行统一的筛选, 排序, 分页等操作. 极大的减轻了开发者的负担, 提高了生产力.

    反观 OData 社区, 目前 node-odata 是唯一一款基于 NodeJS 的 OData 实现. 与其它编译型语言的 OData 实现相比, 它运行更加高效, 部署更加方便, 编写更加简单 (最短只需3行代码即可初始化一个 OData 服务).

    0) Demo

    OData最大的特点就是他完全暴露的数据接口, 服务端只需要几行代码就能让客户端实现随心所欲的查询, 您可以试试:

    很酷炫, 是吗? 你还可以任意组合查询条件, 以实现复杂查询. 比如:

    1) 安装

    node-odata 的运行需要依赖于 NodeJSMongoDB, 在安装了依赖项之后, 运行以下命令即可:

    $ npm install node-odata
    

    2) 快速开始

    这里我们讲创建并运行一个最简单的 OData 服务.

    2.1 创建服务

    安装完成后, 新建 index.js 文件并输入:

    var odata = require('node-odata');
    
    odata.set('db', 'mongodb://localhost/my-app');
    
    odata.resources.register({
        url: '/books',
        model: {
            title: String,
            price: Number
        }
    });
    
    odata.listen(3000);
    

    2.2 运行服务

    保存后输入以下命令即可启动 OData 服务:

    $ node index.js
    

    它将自动注册以下路由:

    GET    /odata/books
    GET    /odata/books/:id
    POST   /odata/books
    PUT    /odata/books/:id
    DELETE /odata/books/:id
    

    (点击 这里 查看完整文档)

    (查看 GitHub Page 请点击 这里)

    25 条回复    2015-04-09 10:39:09 +08:00
    ZackYang
        1
    ZackYang  
    OP
       2015-01-13 16:08:32 +08:00
    该开源项目目前已被 OData 官网 ([odata.org](http://www.odata.org/libraries/))收录
    hahastudio
        2
    hahastudio  
       2015-01-13 16:26:37 +08:00
    @livid 要不要考虑一下修改配色的事情呢
    learnshare
        3
    learnshare  
       2015-01-13 16:33:05 +08:00
    代码颜色...
    ZackYang
        4
    ZackYang  
    OP
       2015-01-13 17:09:28 +08:00
    @hahastudio
    @learnshare

    这是v2ex Node主题的问题吧, 我已经醉了.
    coolicer
        5
    coolicer  
       2015-01-13 17:24:59 +08:00   ❤️ 1
    哈哈哈哈哈
    支持一个先
    vinthony
        6
    vinthony  
       2015-01-13 23:31:55 +08:00   ❤️ 1
    好赞顶
    Livid
        7
    Livid  
    MOD
       2015-01-14 06:42:05 +08:00
    @hahastudio 收到。确实需要修改这里的配色。
    Livid
        8
    Livid  
    MOD
       2015-01-14 06:43:20 +08:00
    @hahastudio
    @ZackYang

    代码区域的背景色已经修改。
    ZackYang
        9
    ZackYang  
    OP
       2015-01-14 11:14:38 +08:00
    @Livid Good job, 不过下面滚动条是不是也需要调调? 看起不是很和谐.

    btw, 为啥这么跑题啊, 摔!
    shuson
        10
    shuson  
       2015-01-14 11:58:50 +08:00   ❤️ 1
    很不错的lib,准备自己的项目上试试先
    makuta
        11
    makuta  
       2015-01-19 10:56:21 +08:00
    如何制定collection啊
    ZackYang
        12
    ZackYang  
    OP
       2015-01-19 11:32:59 +08:00   ❤️ 1
    @makuta
    如介绍中的
    model: {
    title: String,
    price: Number
    }
    这就是collection的定义, 你可以增加任意字段, 包括复杂类型.

    这里有几个example可以看看:
    https://github.com/TossShinHwa/node-odata/tree/master/examples
    makuta
        13
    makuta  
       2015-01-21 17:01:46 +08:00
    为什么 mongo 里 collection的名字和 register里的url 不一样 总会多一个s 怎么解决collection 不要s
    ZackYang
        14
    ZackYang  
    OP
       2015-01-21 17:09:00 +08:00
    @makuta 实际上这是由 mongoose 自动添加的, 有时候确实很烦. 我会在下一个版本中移除这个特性.
    makuta
        15
    makuta  
       2015-01-21 17:13:57 +08:00   ❤️ 1
    @ZackYang o 我用的mongodb
    ZackYang
        16
    ZackYang  
    OP
       2015-01-21 17:19:22 +08:00   ❤️ 1
    @makuta
    已修复这个问题, 请使用 `npm update node-odata` 更新到新版本.

    mongoose 是 mongodb 的一个 ORM, 在 node-odata 内部使用, 主要用于保障 model 存储时, 其值符合数据结构的格式.

    详见: https://github.com/TossShinHwa/node-odata/issues/10
    makuta
        17
    makuta  
       2015-01-21 17:34:12 +08:00
    太赞了
    makuta
        18
    makuta  
       2015-01-21 18:13:45 +08:00
    @ZackYang 好像filter 对中文好像不行
    makuta
        19
    makuta  
       2015-01-21 18:22:37 +08:00
    @ZackYang 可以用 我格式错了
    makuta
        20
    makuta  
       2015-01-21 19:07:22 +08:00
    @ZackYang 你这个地方的db 能支持多个db吗?
    ZackYang
        21
    ZackYang  
    OP
       2015-01-22 20:18:24 +08:00   ❤️ 1
    @makuta 目前只打算做其他数据库的Adapter, 比如MySQL和PostgreSQL.

    你说的多数据库是指多个 MongoDB 吗? 如果那样建议直接开2个服务搞定, 既然数据库都是分离的, 那业务逻辑等也应该全部分离才对. 中间要通信的话直接用 REST 搞定.
    binarymann
        22
    binarymann  
       2015-03-26 10:55:43 +08:00   ❤️ 1
    @ZackYang 请教下Zack,我对nodejs及mongo还很生疏...

    我安装好了mongo,将它跑了起来 `C:\"Program Files"\MongoDB\Server\3.0\bin\mongod.exe`

    然后copy了范例 index.js

    ```
    var odata = require('node-odata');

    odata.set('db', 'mongodb://localhost/my-app');

    odata.resources.register({
    url: '/books',
    model: {
    title: String,
    price: Number
    }
    });

    odata.listen(3000);
    ```

    node index.js 后被抛了个error

    ```
    base.js:246
    throw message;
    ^
    TypeError: Cannot read property 'length' of undefined
    at processResults (C:\Users\i314323\node_modules\node-odata\node_modules\mongoose\node_modules\mongodb\lib\mongodb\db.js:1581:31)
    ```
    ZackYang
        23
    ZackYang  
    OP
       2015-03-26 14:12:07 +08:00
    @binarymann

    ```
    mkdir test
    cd test
    npm install node-odata
    vim index.js
    (添加示例测试代码)
    node index.js
    ```

    刚测试了下, 使用上面代码 + Mongo 3.x 应该是没有问题的.

    请问您的 NodeJS 版本具体是?
    binarymann
        24
    binarymann  
       2015-03-26 14:48:34 +08:00   ❤️ 1
    @ZackYang 回Zack,我的node版本是
    λ node -v
    v0.10.36

    说不定和我在win上跑也有关系?我晚上回去在mac上试试,感谢你的回复
    ZackYang
        25
    ZackYang  
    OP
       2015-04-09 10:39:09 +08:00
    @binarymann Sorry, 刚刚在一台新的机器上试了下确实有这个问题. 这是由于我其中依赖的一个组件没有指定特定版本, 结果作者更新了但不向下兼容导致报错.

    已修复了这个问题. thx.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1182 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 17:50 · PVG 01:50 · LAX 09:50 · JFK 12:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.