前阵子做的项目中,字段比较多,初学node代码写的很混乱,最终成了酱紫:
屏幕快照 2014年09月25日 上午12.25.39.png
现在准备重构这个项目,callback用promise替代,用orm替代手写sql语句,这里有两个问题:
- nodejs中大部分操作是回调式的,假设使用Q的话,是否要用
.defered()方法在函数入口处promise化,然后继续逻辑处理? - orm搜了一下,发现start最多的式 http://sequelizejs.com/,准备翻翻文档用起来,orm除了无需手写sql之外还有什么好处吗?目前有哪些开源项目使用了orm+promise?
tks
promise库推荐bluebird,现在promise库大部分都支持对node格式的回调进行直接转换,不用再手动处理了,比如bluebird提供的Promise.promisify接口
@ravenwang 看了这个系列文章:http://segmentfault.com/blog/kk_470661/1190000000586666 (链接后面的文字也会成文链接) 就先使用 Q 没有用 bluebird 了,不知道是智商不够还是和棒子思维不一样,很难入门 Q
@alsotang 我发现链接后面还有文字也会被转成链接,加一个\就行了,示例:http://cnodejs.org/topic/5422f46829fd004a6a13b91d,aabbccdd
重构完成后,首页是酱紫的: 屏幕快照 2014年09月26日 下午11.47.09.png
ListAll() 是定义在model中的方法,路由的逻辑被Controller层handle,简直酸爽
@alsotang 弄懂回调才是根本,在这个基础上,async eventproxy promise 自然就都明白了。有些人本末倒置了,还要来惊诧一下。
弄不明白回调的,上面的库再华丽,也是纸糊的。因为库不可能帮人解决所有问题,如果这个库有解决所有问题的愿望,就会变得很复杂很庞大,那就陷入了另一个无法理解的境地。所以我认为弄懂根本才是正途。
我也很喜欢回调,所以我喜欢async。
用yield处理回调呀,tj大神的co很好用的,node v0.11版本 支持 es6 的yield,再用koajs就好极了,哈哈,另外我自己是觉得没必要非要搞个orm,自己写个sql模板,把sql和js代码分离出来,用的时候用参数填充下sql模板,又轻量又简洁。
@yeaha 没必要扣这么大的帽子,如果你认为我的语言让你不舒服了,还请见谅。
你仔细读下我的文字,我的意思是用各种库之前要真正理解了回调本身,我并没有针对个别人。如果说要针对,仅仅对那个惊诧的人而已,我也只是说了本末倒置,并未假设他就不懂回调。
orm直接支持promise写起数据层来就比较舒服了.然而promise还是有弊端.如果对promise的机理不甚了解的话可能会造成"知其型不知其意",导致看得懂代码改不了代码的困境.我最喜欢promise的地方是他的错误处理,所有显性和隐性的错误都可以捕获,而回调的话隐形的错误处理会比较不好处理.
强推一个牛逼架构,onela,node.js使用npm install onela安装。需要稍微配置下,强大之处就是支持分布式数据库,而且支持读写分离,配合分布式缓存应用直接可以跑中大型应用灵活度相当高。架构预设了多种类型的数据库支持(不过目前只开放了mysql部分),跨数据库无SQL编程,可以很好的跟自有分布式缓存结合,开发高性能应用完全有潜力,实现本地事务,后续结合消息队列感觉能继续迭代分布式事务。开发人员只关注业务逻辑部分,另外这套ORM框架是基于Promise实现整套架构,链式方法结构避免了令人呕吐callback,写法相当优雅。 GitHub: https://github.com/zouwei/onela npm: https://www.npmjs.com/package/onela 在架构内部内置了初始化配置的工具方法,一键初始化配置文件,后台常用的增删改查快速模板化生成代码,爽的不要不要的。
@guosen88100300 sequelize是node比较成熟的方案,一般中小型应用可以直接拿来用,而且完善程度也比较。我之所以重写一套ORM框架,就是因为目前所有的ORM框架中都没有很好的解决大型应用高访问量,高并发,数据库多实例拆分,分布式缓存,分布式事务,消息队列能很好对接的应用框架。中小应用读写分离是个很基础的方案吧,不可能把io都交给一个数据库来解决问题吧,更不用说分布式系统的开发。这也是我一开始没有采用sequelize的原因。onela这套ORM框架出点的初衷就是高性能框架,当然完善程度还不是很高,对数据库的支持目前只实现了mysql,不过用这套框架开发短平快的项目,而且预留足够的性能扩展空间,是非常不错的方案。