我正在开发一个应用程序,其前端是使用jquery mobile构建的.此应用程序需要数据库访问才能获取各种信息.它还需要更新数据库.
为了同步我的应用程序前端,我正在考虑将node.js用作中间层.选择node.js是因为我们希望它能够正确扩展.这个中间层将为前端提供所需的所有必需数据.它还将从前端接收数据并更新后端数据库.
问题是数据将具有相当复杂的结构和关系.手动将数据模型转换为纯JSON数据模型可能会变得非常痛苦.所以我也在考虑使用其他一些模块/框架.我尝试使用Jaydata,以便我可以构建数据模型,然后使用OpenData协议公开它们,但它的文档似乎缺乏.我也想使用Sequelize,但我认为它在这一点上没有很好的数据库支持(触发器,程序和所有).
那么在这一点上我可以用什么来满足我的要求呢?是否有任何节点模块/框架满足我的要求,或者我是否必须使用原始代码从后端获取数据,将其转换为适当的模型并提供服务?
我使用Postgresql作为我的后端数据库.目前我的前端是使用jquery mobile制作的,但我可能会选择使用不同的技术(PHP/ASP.NET)来构建它.
更新:JayData Server对NodeJS平台有很多改进,例如现在MongoDB支持导航属性.现在使用该系统非常简单,请阅读有关如何设置自己的MongoDB中间层服务器的更多信息.
你确实可以使用JayData,只要它的限制在你的接受范围内:
在服务器端,JayData作为NodeJS包运行,并支持sqLite和mongoDB.随着1月1.3的到来,将添加mysql和MSSqlServer支持.JayData实际上将服务器端数据库暴露为符合OData V2的端点,并在1月份提供V3支持.
SqLite具有导航属性,但mongoDB具有性能.对于生产规模实现,只有mongoDB才是可行的方法.限制是目前JayData不支持与mongoDB的自动关系(导航属性).我可以确认1.3中的mongoDB提供程序将支持导航属性
你能在这里实现的是拥有一个复杂的服务器端模型,它具有用于实现1..n和1..1关系的参考字段,但是你将无法根据导航属性进行查询,也无法使用服务器形状深树的"包含"运算符.
我正在准备一个关于如何使用JayData在NodeJS/mongoDB平台上公开模型的小例子,并在此处进行修改.
更新:或者您可以使用JavaScript API服务(这是JayData中的低级API)实现您自己的Data 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
Run Code Online (Sandbox Code Playgroud)
1)创建并启动没有mongoDB后端的API Service类.
/*** 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 ***/
Run Code Online (Sandbox Code Playgroud)
用以下方法调用helloWorld:
bash$: curl http://localhost:8080/test/helloWorld
Run Code Online (Sandbox Code Playgroud)
上面提到的博客文章从这一点显示更多
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 */
Run Code Online (Sandbox Code Playgroud)
由于"测试"数据库是使用OData协议公开的,因此您可以从任何AJAX工具执行CRUD操作,但我建议使用datajs或JayData.
另请注意,使用数据服务类,您可以定义可以更改要插入的数据或取消操作的服务器端事件处理程序(非常类似于SQL世界中的触发器).您还可以将授权逻辑传递到JayData服务器上下文,以强制执行基于用户的规则和访问控制.