学习并记录基于nodejs的express框架。什么是express呢?
基于 Node.js 平台,快速、开放、极简的 web 开发框架
本次学习不采用全局安装,首先创建一个文件夹并进入,打开cmd,键入npm install express --save
,回车安装express。
安装 Node 模块时,–save 参数可将此模块将被添加到 package.json(package.json的介绍) 文件中 dependencies 依赖列表中。
创建helloWorld.js,写入以下代码:
var express = require('express');//加载express模块
var app = express();//创建express实例
app.get('/', function (req, res) {
res.send('hello World!');
});
var server = app.listen(3000, function () {
console.log('Example app listening at http://localhost:3000);
});
待命令行显示Example app listening at http://localhost:3000
后,在浏览器地址栏中输入localhost:3000
便会看到熟悉的hello world
了。
接下来记录一些express的常用属性及方法:
上文中的app即为application,下面介绍一些常用的方法:
1. app.use([path,] function [, function…])
用来注册express中间件,什么意思呢?简单来说就是处理http请求的。
怎么理解呢?直接上代码:
var express = require('express');
var app = express();
app.use(function(req,res,next){
console.log('中间件');
next();
})
app.get('/', function (req, res) {
console.log('hello World')
res.send('hello World!');
});
var server = app.listen(3000, function () {
console.log('Example app listening at http://localhost:3000');
});
在app创建后注册一个中间件,此时访问localhost:3000
,命令行打印如下:
注意中间件最后一行next()
,如果没有这句代码,程序将会阻塞。第一个可选参数path用来指定中间件要处理的http请求地址。如:
app.use('/user',function(req,res,next){
console.log('我只处理/user');
next();
})
个人理解:拦截http请求并处理,处理完成之后通过next()放行;
app.get和app.post是app.use的特殊处理。path也可以用模式匹配和正则匹配:
//模式匹配:冒号后的‘变量’可以用req.params获取
app.use('/user/:id',function(req,res,next){
console.log(req.params.id)
next();
})
//正则匹配
app.use(/^\/(a.*)/,function(req,res,next){//匹配以a开头的地址,加括号可以在req.params中获取匹配结果。
console.log(req.params)//
next();
})
2. app.get(path, callback [, callback …])
可以简单的理解为设置一个get请求,path为路径,callback为当调用这个接口时的处理函数。
3. app.post(path, callback [, callback …])
设置post请求,参考上方。
4. app.listen(port, [hostname], [backlog], [callback])
监听port端口
5. 模板引擎
- app.set(‘view engine’, value):设置view engine
属性为你要使用的模板引擎值。
- app.engine(ext, callback):根据相应的模板引擎设置后缀和处理函数。
设置ejs:
var ejs = require('ejs');
app.engine('.html', ejs.__express);
app.set('view engine', 'html')
app.set("views", process.cwd());//设置视图文件所在路径
完整示例:
//ejs.js
var express = require("express");
var ejs = require('ejs');
var app = express();
app.engine('.html', ejs.__express);
app.set('view engine', 'html')
app.set("views", app.path());
app.use(function(req, res, next) {
res.locals.userinfo = {//res.locals设置本地变量,生命周期为本次请求有效。相对性的app.locals则是贯穿全局。
username : "peter"
};
next();
});
app.get("/", function(req, res) {
var list = [1, 2, 4, 5, 5, 7, 8];
res.render("ejsTemp", {title : "ejs测试", list : list});
});
app.listen(4000);
//ejsTemp.html
"UTF-8">
<%=title%>
<%= userinfo.username%>
<%for(var i = 0 ; i < list.length ; i++) {%>
- <%= list[i]%>
<%}%>
更多有关ejs的内容,烦请自行搜索。
request(以下简称req)对象表示一个HTTP请求,并包含一些请求时携带的属性。
1. req.body
请求体,可以配合body-parser
和multer
来处理post请求提交的参数。官方demo:
var app = require('express')();
var bodyParser = require('body-parser');
var multer = require('multer');
app.use(bodyParser.json()); // for parsing application/json
app.use(bodyParser.urlencoded({ extended: true })); // for parsing application/x-www-form-urlencoded
app.use(multer()); // for parsing multipart/form-data
app.post('/', function (req, res) {
console.log(req.body);
res.json(req.body);
})
2. req.query
包含get请求url后的参数对象。例如URL为locahost:3000/user?username=peter&password=123456
,那么req.query.username
就是peter
3. req.cookies
结合cookie-parser
模块可以操作cookie
var express = require('express');
var cookie = require('cookie-parser');
var app = express();
app.use(cookie())
之后便可在路由中以req.cookies.key
操作cookie了
response(以下简称res)表示HTTP请求响应对象。
1. res.cookie(name, value [,options])
设置cookie:
res.cookie('username', 'peter',{'maxAge':30000});
2. res.clearCookie(name [,options])
删除指定cookie
res.clearCookie('username');
3. res.send([body])
返回json格式数据,参数可以是一个Buffer对象,一个字符串,一个对象,或者一个数组。当参数是对象或数组时,将已json格式返回。通过res.json([body])也可返回json数据。
res.send({username:'peter'});
4. res.redirect([status,] path)
重定向,可指定status
res.redirect('/user/login');
5. res.render(view [, locals] [, callback])
渲染视图并发送给客户端。view为项目视图(默认在views)目录下的文件。
6. res.set(field [, value])
设置响应头
res.set('Content-Type', 'text/plain');
最后,一些有帮助的链接,也是我学习express的地方:
express4.x API——未翻译的中文API
中文API——可以凑合着看。
express介绍——阮一峰