使用node.js作为中间层

时间:2012-10-14 13:10:39

标签: api node.js

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

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

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

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

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

1 个答案:

答案 0 :(得分:6)

更新:JayData Server对NodeJS平台有很多改进,例如MongoDB现在支持导航属性。现在使用该系统非常简单,请详细了解如何设置own MongoDB back middle tier server

你确实可以使用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

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 ***/

使用以下命令调用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协议公开了“test”数据库,您可以从任何AJAX工具执行CRUD操作,但我建议使用datajs或JayData。

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