Nodejs:复杂业务逻辑该写在哪里或如何写?
最近我接触到了node.js,还有一些很酷的包,比如express和jade。现在我有几个问题一直在困扰我:
如果我选择用node.js来搭建我的下一个网站,那我是不是要用JavaScript来写服务器端的复杂逻辑呢?但是我觉得JavaScript和Java或Python比起来,写服务器端代码的库实在是太少了。node.js真的适合做这个吗?还是我有什么地方没理解清楚?
我可以在node.js中调用Java或Python吗?
6 个回答
Ryan最开始并没有用JavaScript。Node之所以用JavaScript来创建,很大一部分原因是因为JavaScript缺少大量的库。
这些大量的库几乎都是用阻塞代码写的。
要充分利用Node.js,你需要限制自己使用非阻塞的库。这意味着你可能需要自己写一些库来完成你的Node.js项目。
我觉得你可能忽略了一些东西——更具体来说,就是Node.js的核心目的,也就是它的异步输入输出模型。
我开始了一个小项目来测试Node.js,想看看它的使用体验和编程方式。我对在这个生态系统中工作的简单性感到很惊讶:Node.js的代码很容易写(尽管它的异步编程方式对传统程序员来说可能不太容易理解),库的构建也很简单等等。甚至npm也非常简单:我发现提供自己代码作为库的最直接方法就是做一个公开的包——这简直太简单了!
不过,关于Node.js的工具并不多。也许是因为做任何事情都“太”简单了,大多数库都是部分实现的,缺乏文档的解决方案。
另外,要注意Node.js的关键区别不在于JavaScript语言,而在于它的异步输入输出模型。这是Node.js最有趣的地方,但异步编程风格并没有像传统的网页开发那样经过充分测试。也许它真的是被宣传的奇迹——或者说,它并没有那么好。
即使它真的有用,你是否有足够的开发者来维护这样一个(至少目前仍然)不寻常的代码库?如果你能从Node.js的异步“生活方式”中获得很多好处,你也可以选择更成熟的语言和框架,比如我最喜欢的Python的Twisted。Java也可能有类似的东西。总之,我怀疑你现在对这种模型并不太感兴趣,因为你的问题更关注语言而不是编程范式,所以Node.js对你来说可能没什么吸引力。
所以……不,我现在不会在Node.js上专业开发什么,尽管我觉得学习它既有趣又有启发性。不过你可以尝试——只要记住Node.js的主要目的:异步输入输出,事件驱动编程。如果这正是你想要的,Node.js是个不错的选择。
我不太明白这些人说的是什么。
所谓的“海量库”是社区正在积极开发的东西。你可以看看这个链接:http://search.npmjs.org/#/_analytics -- 昨天就发布了8个新包。
这并不能替你解决软件设计的问题。至于如何编写业务逻辑,很多人会选择使用mvc或mvvm这样的结构。如果你在构建应用程序,并且喜欢Ruby开发者(比如说)组织代码的方式,你可以尝试那样做 -- 没有人会告诉你该怎么组织你的代码。
可以查看一下 https://github.com/joyent/node/wiki/modules
以下是一些日常开发中比较流行的库:
- Express: http://expressjs.com/ - https://github.com/visionmedia/express
- 受Sinatra启发,用于构建典型的网页应用
- 统计数据:3407个关注者,286个分支,当前有778个拉取请求
- 和Sinatra本身相比!2529个关注者,366个分支
- 通过connect,它支持各种中间件:
- 会话管理,
- 各种路由,
- 静态文件
- 大约15种不同的模板引擎
- 验证、表单处理等等
- Socket.io: http://socket.io/ - 让它变得“实时”
- DNode: https://github.com/substack/dnode - 在任何东西之间进行远程过程调用(rpc)
- Backbone.js: http://documentcloud.github.com/backbone/ - MVC
- Spine.js: http://maccman.github.com/spine.tutorials/index.html - MCV
- 在服务器上重用代码的技术:
- http://maccman.github.com/spine.tutorials/node.html
- caolan/async: https://github.com/caolan/async - 帮助管理你的异步业务逻辑
- 数据库,选择你喜欢的
- node_redis, https://github.com/mranney/node_redis - 或者其他八个客户端中的一个
- “这是一个完整的Redis客户端,支持所有Redis命令”
- node-mysql, https://github.com/felixge/node-mysql - 或者其他十一个客户端/ORM
- node-mongodb-native, https://github.com/christkv/node-mongodb-native
- node-postgres, https://github.com/brianc/node-postgres
- node_redis, https://github.com/mranney/node_redis - 或者其他八个客户端中的一个
如果你需要ORM,还有很多选择。比如 http://mongoosejs.com/、http://sequelizejs.com/ 等等。
测试驱动开发是Node的核心。有15种不同的TDD包可供选择,从完整的代码覆盖分析到自定义的断言模块。
说所有模块都不完整是很无聊的。每天都有一群非常敬业的人在这个社区中构建和维护大量的开源项目。
可能有理由不选择Node,但绝对不是因为社区不活跃或缺少库。