node.js上除了Express还有哪些好用的web开发框架
- Express
这个就无需再介绍了吧, 几乎已经成为闭眼推荐的首位, 有点在于简单灵活, 缺陷也在于过于简单, 相当于每个功能都需要自己选择不同组件搭建,
虽然有各自脚手架帮助, 但对于开发大一点的系统还是缺乏必要的代码框架, 光搭建整合基础框架就会花不少时间,
对于新上手node.js不久的笔者而言,自由灵活也意味着容易犯错,
最好有类似Djongo/ThinkPHP那样out-of-box即开即用的开发框架快速上手而不是坐而论道.
缺点: 缺少规范性, 需要自己选择搭配的组件太多, 不太适合应用复杂的业务.
- Koa
Express基于ES6的升级版, async/await解决ES5 callback hell的痼疾, 但是选择框架不仅仅是框架本身, 同时还要看插件扩展的丰富和成熟度, 因为没有用过担心后面遇坑填不平而放弃, 做研究可以大胆, 做产品必须谨慎.
缺点: 刚开始应用不久, 担心有扩展不足和不兼容问题
- Meteor
一个完全统一前后台开发的一站式框架, 从后台数据库到前端view全部包含在内, 特别适合于重度依赖websocket的SPA(单页面应用)开发, 国外流行的Asana就是完全采用Meteor框架开发.
缺点:自由度不够, 和传统的Web框架概念差异较大.
- socketstream
如果说RESTful是Ajax的概念基础, socketstream实际上更接近于早期RPC的思路, 将函数调用(function name + parameters)建构在websocket协议层之上, 例如下面这段代码其实就是调用远程函数计算.
缺点:和主流的RESTful概念偏离较大, 很少看到实际应用案例
- Sails.js
这是本文的主角, 相当于针对典型应用框架所需组件在Express基础上的集成封装, 把日常开发常用的功能都给你集成好了, 开箱即用,
完全兼容Express的middleware, 如果了解ThinkPHP就更容易上手了, RoR / Convention over
Configuration的概念可以立即进入实际业务开发, 反正做什么事情应该怎么做人家都给你规定好了,
可以从实验代码逐步迭代到中大项目的生产代码.
缺点:(据说)ORM性能不好
虽然难免遇到技术问题需要解决, 但整体而言进展顺利, API访问延迟从100ms降低到10几ms,主要是从此有了一个Service
Runtime解决PHP无状态而强依赖Redis的问题.
- api/
Model / Controller都在这个目录下, 所有代码根据不同职责都被定义好位置, 这一点非常有利于大型项目开发的代码规划.
- api/controllers
这里面写的每一个controller + function 都会被自动映射到路由上, 充分体现convention over configuration的特点, 与ThinkPHP如出一辙, 来一个最基础的hello world吧 - api/controllers/TestController.hello() 方法被自动映射到 /test/hello 而无需任何配置.
- api/services
项目大了程序就必须进行职能分层, 业务相关都作为独立的service一层放在这个目录下, controller仅负责request /
response及差错处理, 既简化controller的代码逻辑, 又可以让service代码被不同模块复用。作用相当于一套全局函数库。
- api/policies
作为前后台分离必然要提供Ajax API给前端, 那么访问鉴权和安全控制必不可少, Sails.js在Express
middleware基础上封装为policy实现访问控制, 如果说上面那个 /test/hello 仅允许登录用户才能访问,
那么加一个验证session的policy就是.
sessionAuth仅允许带有登录session的API请求通过, 多个policy可以组成一个检查链,
只有全通过了才能达到最终的controller, 中间任何一个policy都可以直接response拒绝服务.
这里还借用了passport的req.isAuthenticated(), 根据业务需要可以结合多种检查方式,
把每个独立检查点都作为一个policy, 然后配置为一个policy chain, 功能独立又可以灵活搭配, 类似应用登录检查中的异地登录,
长时间未登录, 连续密码错误, 动态验证码校验都可以用policy的思路去实现.
- api/responses
常用的response页面都在这里了, 当然可以增加新的, 调用就是res.{response_name}(message)
- api/models
Sails.js的ORM实现, 这个目录下的class都会映射为一个持久化的object及attributes, 采用Waterline hook机制实现, 可以配置为MySQL/MongoDB/Oracle/PostgreSQL多种常见数据库.
- assets/
images/fonts/js/css/模板等静态文件下载根路径,build时可采用Grunt进行打包丑化等操作。
- config/
- session.js - 配置session可采用的存储模式,redis/mongo等多种存储方式可简单配置支持。
- http.js - default按照缺省配置就够用了,如果还想自己微调可以完全配置Express的middleware次序。笔者在middleware里面增加了一个客制化的 response-time 中间件用于记录每个API请求的log。
- log.js
-
配置log输出appender,CAUTION:输出log一定要用sails.log而不是console.log,因为可以根据需要配置log输出方式而不修改代码,笔者采用了sails-hook-winston+winston-daily-rotate-file实现按日期命名log文件。 - routes.js/policies.js - 路由和安全策略配置双剑合璧,简单而强大。
- views.js - 配置View模板库。
- views/
如果是正式项目个人更建议用handlebars替换缺省的ejs模板库,优雅替代模板里面的js代码逻辑,尤其可以自定义helper函数瞬间让开发者不必再依赖模板库提供的有限逻辑处理,充分发挥函数式语言的优势。
这是两个被内置的核心js库,前者用于流程控制,后者用于数据结构处理,即使不用sails.js也应该深入掌握。
放弃ejs吧,handlebars更优雅简洁,而且具有更强更容易的处理逻辑扩展能力。全部秘密就在于注册一个自己的函数。
写后台不充分考虑log记录简直等于不带手机去旅行,sails-hook-winston可以无缝将sails.log转接到任意winston transport插件上而无需修改任何代码。
基于passport的第三方认证已经成为JS的标准,几百个知名strategy即插即用,几行配置代码就可以实现微信/微博/钉钉/QQ第三方登录认证,当然最好对OAuth2有简单了解。
Sails.js缺省是自带websocket支持的,而且其model的CRUD操作也自动支持pub/sub操作,一个Ajax请求无论是走HTTP协议还是websocket协议在controller是同一个处理入口,header/session都是一样的,这一特点真切让人感到体贴,不必再针对不同功能采用不同协议然后生成不同代码了。
实测下来socket会频繁断掉重连,而且每次都是不同的IP地址,怀疑两点起因:
- 阿里防火墙专门针对HTTP无状态短连接设计,不允许出现长期的socket连接。
- 为了负载分担和恶意攻击防护,不同请求入口IP地址会变化。
如果说Java的代码稳定是靠语法和Exception捕获来保证的,那么node.js的逻辑反其道行之-如果错了就尽快退出执行,反正catch回调函数抛出的异常就是水中月,进程生命周期管理最佳工具就是pm2,一行代码都不用写即可支持cluster运行模式,即使偶尔出错导致进程退出也会自动重启,确保服务不间断。
后台应用服务最关键的要求是什么?稳定,稳定,还是TMD的稳定。
面对一个过于自由没有类型检查的javascript语言,防范编码错误的最佳武器就是套上类型语言的盔甲,class / interface /
extends / enum etc,少量代码时这是累赘,面对大量代码和复杂结构与逻辑时有语言的支撑才是保命的秘诀。
node.js上除了Express还有哪些好用的web开发框架的更多相关文章
- node.js 下依赖Express 实现post 4种方式提交参数
上面这个图好有意思啊,哈哈, v8威武啊.... 在2014年的最后一天和大家分享关于node.js 如何提交4种格式的post数据. 上上一篇说到了关于http协议里定义的4种常见数据的post方法 ...
- Node.js的框架-express
Node.js的框架 express 是第三方的 express const express=require('express'); const app=express(); const PORT=3 ...
- Node.js 实战 & 最佳 Express 项目架构
Node.js 实战 & 最佳 Express 项目架构 Express Koa refs https://github.com/xgqfrms/learn-node.js-by-practi ...
- node.js入门及express.js框架
node.js介绍 javascript原本只是用来处理前端,Node使得javascript编写服务端程序成为可能.于是前端开发者也可以借此轻松进入后端开发领域.Node是基于Google的V8引擎 ...
- 建立一个node.js服务器(使用express搭建第一个Web环境)
一.官网下载node.js 下载地址:https://nodejs.org/en/download/ 根据向导,下一步安装就可以了! 二.使用express搭建Web环境 express是一个开源的n ...
- Node.js 入门:Express + Mongoose 基础使用
前言 Express 是基于 Node.js 平台的 web 应用开发框架,在学习了 Node.js 的基础知识后,可以使用 Express 框架来搭建一个 web 应用,实现对数据库的增删查改. 数 ...
- nodejs实战《一起学 Node.js》 使用 Express + MongoDB 搭建多人博客
GitHub: https://github.com/nswbmw/N-blog N-blog 使用 Express + MongoDB 搭建多人博客 开发环境 Node.js: 6.9.1 Mong ...
- 深入浅出Node.js(上)
(一):什么是Node.js Node.js从2009年诞生至今,已经发展了两年有余,其成长的速度有目共睹.从在github的访问量超过Rails,到去年底Node.jsS创始人Ryan Dalh加盟 ...
- node.js 基础学习 express安装使用
安装好nodeJs,我们需要使用命令行中安装express. 我这里默认将Node.js安装在C:\Program Files\nodCejs\盘中. 在保持联网的状态下,依次输入如下命令. npm ...
随机推荐
- C++重写(override)、重载(overload)、重定义(redefine)以及虚函数调用
一.基本概念 对于C++中经常出现的函数名称相同但是参数列表或者返回值不同的函数,主要存在三种情况: 1.函数重写(override) 函数重载主要实现了父类与子类之间的多态性,子类中定义与父类中名称 ...
- Varnish后端主机的健康状态检查
author:JevonWei 版权声明:原创作品 配置后端主机的Health Check 环境 Varnish 192.168.198.139 图片服务端 192.168.198.120 程序服务端 ...
- 【DDD】领域驱动设计实践 —— 架构风格及架构实例
概述 DDD为复杂软件的设计提供了指导思想,其将易发生变化的业务核心域放置在限定上下文中,在确保核心域一致性和内聚性的基础上,DDD可以被多种语言和多种技术框架实现,具体的框架实现需要根据实际的业务场 ...
- spring 整合Mybatis 《报错集合,总结更新》
错误:java.lang.NoClassDefFoundError: org/aspectj/weaver/reflect/ReflectionWorld$ReflectionWorldExcepti ...
- Mysql介绍和实践总结
本文首先介绍mysql的安装和基本使用.进阶操作.讲解mysql的导入导出和自动备份,然后介绍安全模式修改密码和mysql的全文本搜索功能,最后记录了个人使用mysql中遇到的问题集. 开始安装: s ...
- 【小白成长撸】--多项式求圆周率PI
/*程序的版权和版本声明部分: *Copyright(c) 2016,电子科技大学本科生 *All rights reserved. *文件名:多项式求PI *程序作用:计算圆周率PI *作者:Amo ...
- Spring Boot + Dubbo 可运行的例子源码-实现服务注册和远程调用
最近公司的一个分布式系统想要尝试迁移到Dubbo,项目本身是Spring Boot的,经过一些努力,最终也算是搭建起一个基础的框架了,放到这里记录一下.需要依赖一个外部的zookeeper. 源码地址 ...
- JavaSE(十)集合之List
前面一篇的corejava讲的是集合的概述,这一篇我将详细的和大家讲解一下Collection下面的List.set.queue这三个子接口.希望大家能得到提升. 一.List接口 1.1.List接 ...
- tkinter第一章1
tk1 ------------------------------------------------------------------------------------------ impor ...
- week2-结对编程【网页实现四则运算】
题目描述: 不知道大家是否尝试过这样一种开发模式:你有一个伙伴,你们坐在一起,并肩作战,面对着同一台显示器,使用着同一键盘,同一个鼠标,你们一起思考,一起分析,一起编程?这次,就让我们来体验一下结对编 ...