在nodejs中使用promise和orm
发布于 5 年前 作者 klamtlne 35273 次浏览 最后一次编辑是 3 年前 来自 问答

前阵子做的项目中,字段比较多,初学node代码写的很混乱,最终成了酱紫:

屏幕快照 2014-09-25 上午12.25.39.png

现在准备重构这个项目,callback用promise替代,用orm替代手写sql语句,这里有两个问题:

  1. nodejs中大部分操作是回调式的,假设使用Q的话,是否要用 .defered() 方法在函数入口处promise化,然后继续逻辑处理?
  2. orm搜了一下,发现start最多的式 http://sequelizejs.com/,准备翻翻文档用起来,orm除了无需手写sql之外还有什么好处吗?目前有哪些开源项目使用了orm+promise?

tks

37 回复

promise 不懂,我喜欢用 eventproxy,用事件思想来解耦比较好懂。

promise库推荐bluebird,现在promise库大部分都支持对node格式的回调进行直接转换,不用再手动处理了,比如bluebird提供的Promise.promisify接口

@alsotang 你竟然不懂promise…… 我认为promise代码还是比eventproxy容易读,更符合人类思维方式

@ravenwang 我本身也蛮喜欢事件回调的

@ravenwang 看了这个系列文章:http://segmentfault.com/blog/kk_470661/1190000000586666 (链接后面的文字也会成文链接) 就先使用 Q 没有用 bluebird 了,不知道是智商不够还是和棒子思维不一样,很难入门 Q

@alsotang 我发现链接后面还有文字也会被转成链接,加一个\就行了,示例:http://cnodejs.org/topic/5422f46829fd004a6a13b91d,aabbccdd

@klamtlne 链接空一格就好了

使用bluebird吧,我也是最近重构自己的代码,换了bluebird

最近在写一个非常简陋的支持 memcached 绑定的 ORM,查询兼容 callback 和 promise 模式。

看到这么多回调吓鸟了, 还是感觉用Promise模块好

重构完成后,首页是酱紫的: 屏幕快照 2014-09-26 下午11.47.09.png

ListAll() 是定义在model中的方法,路由的逻辑被Controller层handle,简直酸爽

@klamtlne 楼主是用Q模块么?能不能给个demo我看看?

@alsotang 我想问一下howdo用过没有情况如何。

:-O 我好喜欢工工整整的代码。

@jeffreyluo 不是Q,是orm内置的,他们用的是bluebird。不过如果你catch到了promise的核心,其实都大同小异了。

@klamtlne 比如有两个方法,a和b,b中要用a返回的数据查询数据库,a().then(b)这样貌似做不到吧?

Q太重了 硬是要用promise的话 推荐when.js 不过你还可以试试 co,把node版本升级到0.12+

@jeffreyluo 看我前面给的链接

@alsotang 弄懂回调才是根本,在这个基础上,async eventproxy promise 自然就都明白了。有些人本末倒置了,还要来惊诧一下。

弄不明白回调的,上面的库再华丽,也是纸糊的。因为库不可能帮人解决所有问题,如果这个库有解决所有问题的愿望,就会变得很复杂很庞大,那就陷入了另一个无法理解的境地。所以我认为弄懂根本才是正途。

我也很喜欢回调,所以我喜欢async。

@coordcn 把问题无限拔高再来批判,提升逼格,没谁说promise解决了所有问题,而且你凭什么就假设别人就不懂回调?无聊

用yield处理回调呀,tj大神的co很好用的,node v0.11版本 支持 es6 的yield,再用koajs就好极了,哈哈,另外我自己是觉得没必要非要搞个orm,自己写个sql模板,把sql和js代码分离出来,用的时候用参数填充下sql模板,又轻量又简洁。

@chemdemo 推荐when.js,快而且小,基本够用。

@yeaha 没必要扣这么大的帽子,如果你认为我的语言让你不舒服了,还请见谅。

你仔细读下我的文字,我的意思是用各种库之前要真正理解了回调本身,我并没有针对个别人。如果说要针对,仅仅对那个惊诧的人而已,我也只是说了本末倒置,并未假设他就不懂回调。

谁都是从这个过程过来的,或者说是大部分接触异步IO回调都会面临这样的问题, eventproxy 和 async 都是不错的解决方案.

用bluebird 怎么重构上面的例子?求大神

@coordcn 我想问一下怎样弄懂回调呢?能否给我链接让我参考一下,谢谢

orm直接支持promise写起数据层来就比较舒服了.然而promise还是有弊端.如果对promise的机理不甚了解的话可能会造成"知其型不知其意",导致看得懂代码改不了代码的困境.我最喜欢promise的地方是他的错误处理,所有显性和隐性的错误都可以捕获,而回调的话隐形的错误处理会比较不好处理.

啊强的ep 自豪地采用 CNodeJS ionic

async语法糖简单点,如果你不学promise的话

@2linziyi2 你挺牛逼的,翻出了这么老的坟。。。

@PeterMu co es6 yield 确实好用

强推一个牛逼架构,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,不过用这套框架开发短平快的项目,而且预留足够的性能扩展空间,是非常不错的方案。

@ravenwang 赞同,Promise 比 event 那种觉得要方便的多,而且和 async await 语法,RxJS 等结合的也很好

@zouwei 有测试么?

回到顶部