3

我正在开发一个应用程序,其前端是使用 jquery mobile 构建的。此应用程序需要访问数据库以获取各种信息。它还需要更新数据库。

为了同步我的应用程序前端,我正在考虑使用 node.js 作为中间层。选择 node.js 是因为我们希望它能够正确扩展。该中间层将为前端提供所需的所有数据。它还将从前端接收数据并更新后端数据库。

问题是具有非常复杂的结构和关系的数据。手动将数据模型与纯 JSON 相互转换可能会变得非常痛苦。所以我也在考虑使用其他一些模块/框架。我尝试使用Jaydata,以便我可以形成数据模型,然后使用 OpenData 协议公开它们,但似乎缺少它的文档。我也考虑过使用Sequelize,但我认为它目前对数据库(触发器、过程和所有)没有很好的支持。

那么此时我可以使用什么来满足我的要求?是否有任何节点模块/框架可以满足我的要求,或者我是否必须使用原始代码从后端获取数据,将其转换为适当的模型并提供服务?

我使用 Postgresql 作为我的后端数据库。目前我的前端是使用 jquery mobile 制作的,但我可能会选择使用不同的技术(PHP/ASP.NET)来构建它。

4

1 回答 1

6

更新:NodeJS 平台的 JayData Server 有很多改进,例如现在 MongoDB 支持导航属性。现在使用该系统也非常容易,阅读更多关于如何设置您自己的 MongoDB 后台中间层服务器的信息。

您确实可以为此使用 JayData,只要它的限制在您的接受范围内:

  • 在服务器端 JayData 作为 NodeJS 包运行并支持 sqLite 和 mongoDB。随着 1.3 的到来,将添加 mysql 和 MSSqlServer 支持。JayData 实际上将服务器端数据库公开为符合 OData V2 的端点,并在 1 月份推出 V3 支持。

  • SqlLite 具有导航属性,但 mongoDB 具有性能。对于生产规模的实施,只有 mongoDB 是可行的方式。限制是目前 JayData 不支持与 mongoDB 的自动关系(导航属性)。我可以确认 1.3 中的 mongoDB 提供程序将支持导航属性

  • 您在这里能够实现的是拥有一个复杂的服务器端模型,该模型具有用于实现 1..n 和 1..1 关系的参考字段,但您将无法根据导航属性进行查询,也无法使用“包含”运算符用于服务器形状的深层树。

我正在准备一个关于如何使用 JayData 在 NodeJS/mongoDB 平台上公开模型并在此处修改的小示例。

更新:或者,您可以使用 JavaScript API 服务(这是 JayData 中的较低级别 API)实现自己的数据 API,将 API 表面公开为具有服务功能的 OData 端点。看看这个:http: //jaystack.com/blog/create-your-first-online-api-with-javascript-api-services。(请注意,本文多次提及 JayStorm 服务,但所描述的技术也适用于本地配置。

以下是使用 JavaScript 数据服务或 JavaScript API 服务启动您自己的 JayData 支持的 NodeJS 中间层的步骤。您使用 JayData 发布的代码将使用 OData 协议发布,并且在客户端上使用 JayData 会将结果转换为类型化的结果树。

请注意,OData 协议层是一个 Connect/Express 中间件,因此您必须使用其中任何一个才能将 JayData 用作服务器。

干净的 linux 系统上的准备工作,您可能不需要大多数步骤

bash$
    sudo apt-get install mongodb
    sudo add-apt-repository ppa:chris-lea/node.js 
    sudo apt-get install nodejs nodejs-dev
    sudo apt-get install  npm build-essential make autoconf libtool flex bison git libxml2-dev
    mkdir test; cd test
    npm install mongodb express http connect q node-uuid bcrypt xmldom qs
    npm install jaydata

1) 创建并启动一个没有 mongoDB 后端的 API 服务类。

/*** begin server.js ***/
var c = require('express');
require('jaydata');
window.DOMParser=require('xmldom').DOMParser;
require('q');

$data.ServiceBase.extend("myapi", {
    helloWorld: function() {
       ///<returns type="string" />
       return "Hello JavaScript Server World";
    }
});
myapi.annotateFromVSDoc();    
var app = c();

app.use(c.query());
app.use(c.bodyParser());
app.use("/test", $data.JayService.OData.Utils.simpleBodyReader());
app.use("/test", $data.JayService.createAdapter(myapi, function (req, res) {
    return new myapi();
}));
app.listen(8080);

/*** end server.js ***/

使用以下命令调用 helloWorld:

bash$: curl http://localhost:8080/test/helloWorld

上面提到的博客文章从这一点上展示了更多

2) 创建一个 mongoDB 支持的 JavaScript 数据服务

/* begin server.js */
var c = require('express');
require('jaydata');
window.DOMParser=require('xmldom').DOMParser;
require('q');
var app = c();
app.use(c.query());
app.use(c.bodyParser());
app.use(c.cookieParser());
app.use(c.methodOverride());

$data.Class.define("test.Product", $data.Entity, null, {
    Id: { type: "id", key: true, computed: true, nullable: false },
    Name: { type: "string" },
    Price: { type: "integer" }
}, null);

$data.Class.defineEx("test.Context", [$data.EntityContext,$data.ServiceBase], null, {
    Products: { type: $data.EntitySet, elementType: test.Product }
});
test.Context.annotateFromVSDoc();

app.use("/test", $data.JayService.OData.Utils.simpleBodyReader());
app.use("/test", $data.JayService.createAdapter(test.Context, function (req, res) {
    return new test.Context({name: "mongoDB", databaseName:"test", address: "localhost", port: 27017 });
}));
app.use(c.errorHandler());
app.listen(8080);
/* end server.js */

由于“测试”数据库使用 OData 协议公开,因此您可以从任何 AJAX 工具执行 CRUD 操作,但我推荐使用 datajs 或 JayData。

另请注意,使用数据服务类,您可以定义服务器端事件处理程序,这些处理程序可以更改要插入的数据或取消操作(很像 SQL 世界中的触发器)。您还可以将授权逻辑传递给 JayData 服务器上下文,以强制执行基于用户的规则和访问控制。

于 2012-10-15T09:05:35.527 回答