这里有新鲜出炉的 Express 指南,程序狗速度看过来!
Express 是一个简洁而灵活的 node.js Web 应用框架, 提供一系列强大特性帮助你创建各种 Web 应用
相信大家都知道 Express 是一个简洁而灵活的 node.js Web 应用框架, 提供了一系列强大特性帮助你创建各种 Web 应用,和丰富的 HTTP 工具。下面这篇文章主要介绍了 node.js 中 express 的入门知识,需要的朋友可以参考下。
一、 介绍
什么是 express,为什么要使用 express?根据官方网站的说法,express 是一个基于 Node.js 平台的极简、灵活的 web 应用开发框架,它提供一系列强大的特性、丰富的 API 接口,对 web 应用的接口进行了二次的封装,提供了 MVC 模式,方便我们可以快速地创建各种 web 和移动应用。
Express 框架核心特性:
本文也只是简单的了解下 express 框架的内容,希望大家能比较快速的入门,更多详细的内容还是阅读官网并查看相关的 API。
express 的中文官方网站:【Express】
二、入门
创建一个目录 myapp,进入到 myapp 后,使用命令
把 express 安装到本地,然后创建 app.js(或 server.js)作为程序的入口。
- npm express --save-dev
- // app.js
- var express = require('express');
- var app = express();
- app.get('/',
- function(req, res) {
- res.send('hello world');
- });
- app.listen(3000,
- function() {
- console.log('server has running at port 3000');
- })
运行 app.js 文件:
- $ node app.js
- server has running at port 3000
在浏览器中访问 http://127.0.0.1:3000 / 就能看到页面上输出的 hello world。说明基本的 express 程序可以正常运行了。
2.1 APP
引入 express 模块后,执行
得到一个 app 实例,app 实例中有 get, post, use, listen 等方法。
- express()
: 当使用 get 方法访问路径 path 时,执行 handler 指定的方法,而且 handler 方法还带有 req 和 res 两个参数供我们使用。req 是请求过来时带的信息,比如参数 query, body, 头部 header 等; res 是我们作为服务器想要返回给浏览器的信息设置。
- app.get(path, handler)
表示是向页面中发送'hello world'字符串。
- res.send('hello world')
当然,如果想要接收 post 过来的请求,可以使用
接收 post 到 path 的请求。
- app.post(path, function(req, res){})
用来监听本地的端口后运行 web 程序,监听成功后执行回调函数。
- app.listen
2.2 路由
我们在之前讲解《从零学习 node.js 之搭建 http 服务器(二)》也说过一点路由的内容,不过那时候我们制定的路由规则非常简单,而且只是处理了 3 个左右的页面而已。而 express 则对路由功能进行丰富。
同时,我们也应该注意的是: / 是表示根路径下,/user 是表示 user 路径下,如果访问 / user/login 时,是直接访问 / user/login 路由的,前面的两个路由是不访问的。
- // 根路径下的请求
- app.get('/',
- function(req, res) {
- console.log('hello world');
- res.send('hello world');
- });
- // /user路径下的请求
- app.get('/user',
- function(req, res) {
- console.log('user');
- res.send('huser');
- });
- // /user/login下的请求
- app.get('/user/login',
- function(req, res) {
- console.log('user/login');
- res.send('user/login');
- });
而且,path 路径还可以通过字符串匹配和正则匹配的方式进行路由选择。
2.3 RES 响应方法
我们在刚上面的例子中,使用
向页面中输出一段'hello world'的纯文本字符串,而且
- res.send()
也可以输出其他类型的数据,比如 html 字符串(浏览器可以解析),Buffer 类型,Object 类型,Array 类型等。
- res.send()
比如我们要输出一段 html 字符串。
- var html = '<!DOCTYPE html>\
- <html lang="en">\
- <head>\
- <meta charset="UTF-8" />\
- <title>Document</title>\
- </head>\
- <body>\
- <div>\
- <p style="color:#f00;">hello world</p>\
- <p><input type="text" /></p>\
- </div>\
- </body>\
- </html>';
- app.get('/',
- function(req, res, next) {
- res.send(html);
- });
我们可以在浏览器上一个红色的 hello world 和一个文本输入框。但是若 html 的代码比较长,我们可以把这些代码都放到一个单独的 html 文件里,然后使用
方法,将 html 文件里的内容输出到页面中。
- res.sendFile()
在根目录下创建一个 index.html 文件,把完整的 html 代码放进去,然后:
- app.get('/',
- function(req, res, next) {
- res.sendFile('index.html');
- });
这样就能在浏览器中看到一个完整的页面了。
此外,res 中还提供了一些别的方法供我们使用:
方法 | 描述 | |
---|---|---|
res.download() | 下载文件。 | |
res.end() | 终结响应处理流程。 | |
res.json() | 发送一个 JSON 格式的响应。 | |
res.jsonp() | 发送一个支持 JSONP 的 JSON 格式的响应。 | |
res.redirect() | 重定向请求。 | |
res.render() | 渲染视图模板。 | |
res.send() | 发送各种类型的响应。 | |
res.sendFile | 以八位字节流的形式发送文件。 | |
res.sendStatus() | 设置响应状态代码,并将其以字符串形式作为响应体的一部分发送。 |
三、中间件
上面我们执行
时,里面的回调函数就是中间件。中间件其实就是一个函数,在使用
- app.get('/', function(){})
,
- app.get
,
- app.post
等方法时,都是在调用中间件作为回调函数。 中间件都可以调用 req 和 res 对象,如果多个中间件顺序向下执行的话,上一个中间还需要一个 next 变量,来调用下一个中间件。
- app.use
这里
的使用方法与
- app.use
一样,都是有两个参数:path 和回调函数,而在这里,path 参数是可以忽略不写的(忽略不写则每个请求都会执行该中间件)。
- app.get
- // 任何的请求,该中间件都会响应
- app.use(function(req, res, next) {
- console.log('index m url: ' + req.url);
- next(); // 若没有next(),则请求就会被挂起,一直等待
- })
- // /topic 下的请求都会响应,包括 /topic/1.html, /topic/c/1.html等
- app.use('/topic',
- function(req, res, next) {
- console.log('topic m url: ' + req.url);
- next();
- })
- // 处理/根目录下的请求
- app.get('/',
- function(req, res, next) {
- res.send('index');
- });
- // 处理 /topic/1.html 这种类型的请求
- app.get('/topic/:id.html',
- function(req, res, next) {
- res.send('topic');
- });
我们在浏览器中输入一些不同的 url 看看:
url | 控制台输出 | 浏览器输出 | 说明 |
---|---|---|---|
127.0.0.1:3000 | index m url: / | index | |
/user | index m url: /user | Cannot GET /user | 中间件响应了不存在页面的请求 |
/topic/1.html | index m url: /topic/1.htmltopic m url: /1.html | topic | 两个 use 中间件都响应了请求 |
/topic/c/1.html | index m url: /topic/c/1.htmltopic m url: /c/1.html | Cannot GET /topic/c/1.html | 两个 use 中间件都响应了请求,只是没有路由来对该 url 进行处理 |
同时,
和
- app.use()
等方法,可以调用多个中间件依次执行,使用
- app.get()
将控制权交由下一个中间件。多个中间件既可以依次作为传输传递进去,也可以都放到数组中,也可以两者混用(
- next()
等同理):
- app.get
- app.use(path, m1, m2, m3, m4...);
- app.use(path, [m1, m2, m3, ...]);
- app.use(path, [m1, m2, m3, ...], m7, m8, ...);
在上面代码的基础上,我们编写多个中间件。
- // 作为数组方式
- app.use([function(req, res, next) {
- console.log('index m 1');
- next();
- },
- function(req, res, next) {
- console.log('index m 2');
- next();
- },
- function(req, res, next) {
- console.log('index m 3');
- next();
- }])
- // 每个中间件作为一个参数
- app.get('/topic/:id.html',
- function(req, res, next) {
- // res.send('topic');
- console.log('topic get 1');
- next();
- },
- function(req, res, next) {
- console.log('topic get 2');
- next();
- },
- function(req, res, next) {
- console.log('topic get 3');
- res.send('topic');
- });
当我们访问 127.0.0.1/topic/1.html 时,在控制台则会输出:
- index m 1
- index m 2
- index m 3
- topic get 1
- topic get 2
- topic get 3
说明中间件是依次向下执行的。我们可以在每个中间件都做不同的处理,不过要记得使用
方法,不然页面就挂了。 我们在上面看到 res 中的方法,至少需要调用一个,不然请求就会被挂起,一直等待或 404。如果对外没有任何的回复,也可以使用
- next()
结束。同时,如果在某个中间件中使用了 res 中的方法,则后面的中间件不再调用。
- res.end()
总结
这里我们也是简要的了解了下 express 框架,更多的内容还是需要查看官网网站。之后我们将使用 express 构建一个简单的论坛系统。感兴趣的朋友们请继续关注 phperz。
来源: http://www.phperz.com/article/17/0430/327285.html