2011-08-09 229 views
0

我必须写一个新的Web应用程序,目前我在决定建筑的过程中,有几件事情我知道我希望能够做到:前端架构的web应用程序

  1. 所有机器必须是对称的,即:商品机器没有定制构建服务器(aws)
  2. 我想要一个与UI分离的ReST API,因为我已经有三个API用于客户端:移动应用程序,网站和服务器第三家公司正在等待要生产的产品
  3. 它需要能够缩放水平(a但重复1)
  4. 易于维护:没有时间去学习新的语言,更多的可用人选,但愿意采用新技术

这里是基本的架构我想出了:

前端相结合的nginx + +的NodeJS + expressjs YUI, API:nginx的+ tomcat的+ Spring框架栈(休息+安全+核心+ AOP)

前端会跟API使用OAuth 2.0

平平淡淡关于我之前做过的api,我知道它的工作原理和运行良好会爱上一些scala的味道,但我没有时间。我主要关心的是前端:nodejs非常令人兴奋,我一直在玩一段时间也喜欢它在JS中的事实,但我担心导航+模板+会话(仅用于身份验证:无状态无状态,无状态)+日志记录+调试它,如果它工作的话,它工作的很好,但它不是一个成熟的环境来开发.....

这里的任何人开发了一个完整的前端堆栈或子集?任何其他建议可供选择?

谢谢你们。

回答

0

但恐怕有关导航+模板+会话(仅适用于 认证:无状态的,无状态的,无状态的)+日志+调试它

导航?不确定你在这里的意思。使用超链接。 AFAIK没有像Rails的form_for()类型助手那样的节点,但那些对我来说从来没有那么有趣。如果你想在过滤器之前/之后想要类似Rails风格的东西,比如说要求登录的用户,那么连接就很好。

app.all('/app/*', requireUser) 

,将调用requireUser开始与/app任何路径。在requireUser里面,你可以确保req.session.user在那里(也许有适当的授权)。如果是这样,你打电话next()和负责实际生成响应的中间件被执行。如果用户未登录或未获得授权,则可以生成30X重定向响应,并且不要致电next()。完成。在express.js guide中有一个很好的例子。搜索loadUser。这种设计非常优雅,恕我直言。

模板?呃,node.js与其他平台相比,具有更好或更好的模板选项。尝试jade或其他任何一个。您可以在服务器和浏览器上使用相同的模板,这是一个不错的胜利。由于您喜欢YUI,请查看this video of Dav Glass using YUI widgets on the server side in node.js

会话? Connect sessions。味道很棒。减少填充。有什么问题?

日志? Winston适合我。我想也有更好的图书馆。

调试? node-inspector为node.js(恕我直言)提供了最好的调试支持。它使用chrome的检查器进行调试,并且与调试客户端JavaScript一样棒。我还可以在通过jasbin运行时调试服务器端单元测试。

下面是对what companies are using node.js in production的回答。

+0

感谢您的链接!通过导航我的意思是类似jsf导航xml,尽我所恨JSF很难看到从链接的整个站点地图进一步控制它,你如何执行身份验证,保护所有的url如果用户没有通过身份验证重定向到一些login.jsp我可以想到几种方法,但有没有一个框架呢? ,由于未捕获的异常导致服务器崩溃的事实也是一个值得关注的问题......您是否已经在生产中运行nodejs? – Amnon

+0

编辑我的答案与导航更多的信息。您还可以使用'app.error'来捕获错误并防止服务器崩溃。我一直在“生产”中使用node.js,但主要是由我自己使用的纳米网站。 –

0

所以,如果你有测试的问题,那么你只是误解Node.js的一些功能和表达。例如,你可以使用这样的事情来进行测试:

app.get('/route', function(req,res,next) { 
    require('./controllers.js').method(req,res,next) 
}); 

然后,你需要在你的controlles.js所需的所有文件下降缓存:

if (require.cache[__filename]) 
{ 
    var del = false; 
    for (i in require.cache) 
    { 
    if (i == __filename) 
    { 
     del = true; 
    } 
    if (del) 
    { 
     delete require.cache[i]; 
    } 
    } 
} 

所以,现在你的控制器会立即更新到当前当请求通过时的版本。

要了解如何做需要的NodeJS工作只是试试这个:

require.js

module.exports = {}; 

为主。JS

var x = require('./require.js'); 
x.tell = true; 
var y = require('./require.js'); 
y.tell = false; 

console.log(require('./require.js'));