node.js做后端的使用总结

时间:2022-08-28 14:44:29

当前一个web portal项目,我用node.js写就,大概有2个月了,后面还会继续迭代开发。总结一些心得。

  • 多数团队还是主要用node.js的npm作为工具仓库,用node.js本身做核心业务支撑的比较少。确实npm发展的越来越好,早已超过cpan成为第一大open source repository了
  • node.js的门槛。这个主要还是看对js的兴趣,写惯js的当然怎么都顺眼,而多年C++的人看到弱类型变量就别扭。就node.js本身,如果不是探寻底层eventlib之类架构的话,js基础知识肯定够用了。标准Ecmascript就行,ES6不是全部都支持
  • node.js的便利性。其实说白了就是npm的便利性,这个简直是机器猫的四维兜,要什么伸手就行。时间处理,安全连接,异步任务,数据库操作,web爬虫,定时调度什么的,真是应有尽有。而且很多应用服务商提供的api接口,都有node版本,或者说java,python,node三接口已经是标配了,缺一个就缺了一大块火热用户群。例子就很多了,比如amazon aws,统一支付网管ping++等等。而且现有的成熟js库都可以直接使用,比如underscore,moment
  • 框架选择。相比java的spring/play,c++的STL,php的thinkphp,python的django/tronado,甚至perl古董级的catalyst,它们要么一统天下,要么多年就一两个,node简直就得了选择困难症。各种框架,前端后台,我感觉一个月出一个也不为夸张。不说angular/vue/react/backbone等面向移动端的,就后端来说除了经典的express.js,还有koa.js为代表的各种后起之秀。最近阿里也开源了一个egg.js。用什么框架,第一要看是否有人维护,是否长期和稳定。还要从用户热度(其实也可以说是google结果量),文档难度,插件和扩展各方面考虑。过于小众的,github上可能久不更新,最新issue都是陈年的。如果团队里新手较多或者业务比较重要,还是建议以exress.js入手。经典,用户基础大,出了异常有的搜,这有点儿像mysql,久经考验
  • 性能问题。关于单线程的javascript能否支撑QPS等吞吐,这个网上有各种压力测试。请根据实际环境自行mock测试,不要贸然上线。我的这个项目,由于是内部用户使用,所以不存在性能问题,node的eventloop机制可以很好的支撑并发请求

前面说了一些泛泛而谈的,就express.js来说,我还有以下具体建议:

  • 如果拿spring来类比,express似乎不是那种DI/IOC容器,需要自行require模块,这个也是ecmascript标准。至于AOP就很简单了,app.js里有各种中间件,其实就是自定义的函数,比如拦截登录做分析等等,比spring还简单
  • 可以做前后端分离,也可以大包大揽。如果是后者,那么需要选择page template。我选择的是默认的jade(现在叫pug),因为我写惯python了所以对缩进很喜欢。如果想要更原生html的可以选择其他如EJS。前端框架用的是JADE-Bootstrap,一个印度大叔写的,github上回应了我一次issue,问了下情况,后来就没touch了
  • 数据库,我们的数据源是aws redshift,类似于postgre,所以采用了pg-promise,很好的异步模式
  • 信息提示,用的默认的connect-flash,这个在做一些错误提示上还是很好用的
  • 循环日志可以用file-stream-rotator

我的pakage.json如下

{
"name": "某个项目",
"version": "0.0.0",
"private": true,
"scripts": {
"start": "node ./bin/www"
},
"dependencies": {
"body-parser": "~1.15.2",
"cookie-parser": "~1.4.3",
"debug": "~2.2.0",
"express": "~4.14.0",
"jade": "~1.11.0",
"morgan": "~1.7.0",
"serve-favicon": "~2.3.0",
"pg": "latest",
"express-session": "latest",
"express-validator":"latest",
"connect-flash": "latest",
"jade-bootstrap": "latest",
"promise": "~6.1.0",
"pg-promise": "latest",
"express-logger": "latest",
"file-stream-rotator": "latest",
"util": "latest",
"string-format": "latest",
"bluebird": "latest",
"date-and-time": "latest",
"underscore": "latest",
"underscore.string": "latest",
"request": "latest",
"node-schedule": "latest"
}
}