透析Express.js
前言
最近,本屌在试用Node.js,在寻找靠谱web框架时发现了Express.js。Express.js在Node.js社区中是比较出名web框架,而它的定位是“minimal and flexible(简洁、灵活)”。
进击的Express.js
1. 底层的Http module
Node有Http module,本质上,我们可以直接通过他写Web应用。Http module使用很简单:
////////////////
// app.js
//////////////// // 加载所需模块
var http = require("http"); // 创建Server
var app = http.createServer(function(request, response) {
response.writeHead(200, {
"Content-Type": "text/plain"
});
response.end("Hello hyddd!\n");
}); // 启动Server
app.listen(1984, "localhost");
运行node app.js。访问http://localhost:1984,即可看到“Hello hyddd!”。
现在问题来了,Web需要通过不同uri区分功能,如:/user/profile 表示用户信息,/about 表示网站简介……,而Http module并没有直接提供dispatch功能,当然,自己实现也不难:
////////////////
// app1.js
//////////////// // 加载所需模块
var http = require("http"); // 创建Server
var app = http.createServer(function(request, response) {
if(request.url == '/'){
response.writeHead(200, { "Content-Type": "text/plain" });
response.end("Home Page!\n");
} else if(request.url == '/about'){
response.writeHead(200, { "Content-Type": "text/plain" });
response.end("About Page!\n");
} else{
response.writeHead(404, { "Content-Type": "text/plain" });
response.end("404 Not Found!\n");
}
}); // 启动Server
app.listen(1984, "localhost");
如果要区别对待Http method,可以根据 request.method 判断。至此,Http module在此场景下的短板显露无疑。
2. 中间层:Middleware
什么是middleware?根据牛文《A short guide to Connect Middleware》里定义,middleware就是一大坨handle requests的funcions。
这里说明下,middleware是一个概念;而上面的Connect,是一个Http Server Framework,基于Http module扩展,可以说它是Express.js的前身。所以可以把Connect等价看作Express.js。先看个Demo:
////////////////
// app2.js
//////////////// // 加载所需模块
var express = require("express");
var http = require("http"); // 创建server
var app = express(); // 增加一些middleware
app.use(function(request, response, next) {
console.log("step1, url:" + request.url);
next();
});
app.use(function(request, response, next) {
console.log("step2");
if(request.url == '/'){
response.writeHead(200, { "Content-Type": "text/plain" });
response.end("Main Page!\n");
}
next();
});
app.use(function(request, response, next) { console.log("step2:");
console.log("step3");
if(request.url == '/about'){
response.writeHead(200, { "Content-Type": "text/plain" });
response.end("About Page!\n");
}
}); // 启动server
http.createServer(app).listen(1984);
运行node app.js,访问:http://localhost:1984/,console结果是:
step1,url:/
step2
Express通过 app.use 注册middleware,middlewares相当于request的handlers,在处理request时,顺序执行每一个handler(function),handler业务完成后,通过调用next();,决定是否调用下一个handler,说白了就是 链 处理。
Middleware是Express.js非常重要的特性,没有之一。基于这个特性,Express.js继续实现了routing-dispatch(让你可以优雅地写request处理函数), 公共的error处理(404,500处理),提供机制给开发者实施权限校验机制等等。而在各种Express.js文档中,这块的篇幅是最长的,Express.js很多的变化和淫荡技巧会在middleware得到体现。
3.1 顶层:Routing
app2.js的里,虽然通过middleware方式,把“/”和“/about”独立出来,但和优雅的高可读代码还没半毛钱关系。Routing是基于Middleware特性,它其实就是匹配不同的request到不同的handler上:
////////////////
// app3.js
//////////////// var express = require("express");
var http = require("http");
var app = express(); app.all("*", function(request, response, next) {
console.log("step1");
next();
}); app.get("/", function(request, response) {
response.end("Home Page!");
}); app.get("/about", function(request, response) {
response.end("About Page!");
}); app.get("*", function(request, response) {
response.end("404!");
}); http.createServer(app).listen(1984);
这样确实优雅了许多,至于更多的奇淫技巧可以参看各种文档。
3.2 顶层:Views
额,Express加入了View处理机制,一起看看:
var express = require("express");
var app = express();
// 模板目录:./views
app.set("views", __dirname + "/views");
// 使用jade引擎
app.set("view engine", "jade");
// 寻址views/index,提交jade渲染,并返回结果
app.get("/", function(request, response) { response.render("index", { message: "I'm hyddd" }); });
Express的View机制还是简单的。
3.3 顶层:其他“小”特性
我之所以称其他特性为“小”特性,是因为他们相对前两者(特别是Routing),在框架中的地位都是次要的。
举个栗子:response,Express的response基于Http.Server的response扩展,提供了一些新功能,如:response.redirect("/user/login"); 和 response.sendFile("/path/to/file");。
其他的,大家可以参考官方文档。
总结
Express正如官网中的描述一样“minimal and flexible”。Express主要解决了 请求路由 和 视图模板 的问题,其中Middleware是它最重要的概念。它是不错的Web框架,但本屌还是有些想法的:
1. Express不是MVC的框架,因为它没有对Model解决方案。嗯,有点废话,因为Express本身定位就不是MVC,只是minimal and flexible的Web框架。
2. 由于Express实在是flexible,没有强制的规范约束,加上js是可以把代码写得很随意的编程语言,所以本屌找到的Demo中,Config,Controller,View的维护、管理、技巧都可能各式各样。
所以,没有明确Model解决方案(当然你可以找第三方的)和弱规范约束,使整天踩在别人(巨人)肩膀上的本屌开始时不太适应。
参考资料
2. 《A short guide to Connect Middleware》
3. 《expressjs官方文档》
透析Express.js的更多相关文章
- 安装express.js(NODEJS框架)
express.js是nodejs的一个MVC开发框架,并且支持jade等多种模板.下面简单来说说express的安装和app.js文件的配置,然后在今后的教程中一步一步使用express.js搭建个 ...
- 《Pro Express.js》学习笔记——Express服务启动常规七步
Express服务启动常规七步 1. 引用模块 var express=require('express'), compression=require('compression'), bo ...
- 《Pro Express.js》学习笔记——概述
要学Node.js,先学Express.js. Express.js是Node.js官方推荐的基础框架. Express.js框架经过一系列的发展,已经到了4.x版本.新的版本解决了3.x之前版本的依 ...
- node.js和express.js安装和使用步骤 [windows]
PS: NODEJS:https://nodejs.org NPM:https://www.npmjs.com/ 一.node.js安装与配置 到https://nodejs.org/en/downl ...
- node.js入门及express.js框架
node.js介绍 javascript原本只是用来处理前端,Node使得javascript编写服务端程序成为可能.于是前端开发者也可以借此轻松进入后端开发领域.Node是基于Google的V8引擎 ...
- node.js Web应用框架Express.js(一)
什么是Express.js Express 是一个简洁而灵活的 node.js Web应用框架, 提供一系列强大特性帮助你创建各种Web应用,提供丰富的HTTP工具以及来自Connect框架的中间件随 ...
- Ruby设计模式透析之 —— 适配器(Adapter)
转载请注明出处:http://blog.csdn.net/sinyu890807/article/details/9400153 此为Java设计模式透析的拷贝版,专门为Ruby爱好者提供的,不熟悉R ...
- soket.io.js + angular.js + express.js(node.js)
soket.io.js + angular.js + express.js(node.js) 今天搭建个soket.io.js + angular.js + express.js的环境, 采坑无数,特 ...
- Ruby设计模式透析之 —— 组合(Composite)
转载请注明出处:http://blog.csdn.net/sinyu890807/article/details/9153761 此为Java设计模式透析的拷贝版,专门为Ruby爱好者提供的,不熟悉R ...
随机推荐
- 通过统计用户DNS解析记录,实现监控用户上网行为
上次通过扫描抓包分析TTL的方式检测公司网络开放的端口,发现没有开放53端口(DNS),也就是在公司内部的主机只能用服务器自动分配的DNS,并且发现这是台内部服务器.今天发现bing上不去,检测后发现 ...
- Xamarin studio配置问题
最近对Xamarin很感兴趣,就下班抽空在家里的电脑上进行配置,于是乎出现了各种问题,对此进行总结. 1. Cannot find `aapt.exe`. Please install the And ...
- Java猜拳小游戏(剪刀、石头、布)
1.第一种实现方法,调用Random数据包,直接根据“1.2.3”输出“剪刀.石头.布”.主要用了9条输出判断语句. import java.util.Random; import java.util ...
- Tomcat部署遇到的问题
项目服务端:Tomcat6.0.41 选用数据库:Mysql5.6.17 JDK环境:1.6.37 运行系统:Windows server 2008(64bit) ================== ...
- 关于netty
现在我们一般使用应用程序或者链接库相互进行通信.例如,我们经常通过一个使用http协议的客户端链接库,从网站服务器中获得信息,并且通过网站服务,调用一些远程程序. 然而,一些通用协议或者它们的实现方式 ...
- [UCSD白板题] Covering Segments by Points
Problem Introduction You are given a set of segments on a line and your goal is to mark as few point ...
- 命令行中mysql乱码问题
1.现象 在命令行中,执行sql语句如果包含中问题,提示“ Data too long for column '列名' at row 1” 或者在命令行中查询出的结果中,中文乱码 2.分析 ...
- NYOJ 737 石子合并(一)
分析: 本题为区间型动态规划,dp[i][j] 表示从第 i 堆合并到第 j 堆的最小代价, sum[i][i] 表示第 i 堆到第 j 堆的石子总和,则动态转移方程: dp[i][j] = min( ...
- misc
1.对于给定的二维码图片不能直接扫描出来的可以进行反色在进行扫描,反色可以直接选中图片然后就会进行反色.2.局域网中抓取的数据包的加密方式可能是aes加密.3.凯撒加密可能是变种的凯撒加密,可能奇数偶 ...
- 自己做了一个json格式化工具,亲测可以使用
随笔背景:在向后台请求数据之后,我们常常会拿到一串json格式.此时,为了方便查看key-value,程序猿们常常使用一些在线json格式化工具或者是类似于notepadd++这样的工具进行转换.今天 ...