学习并记录基于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 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title><%=title%></title> </head> <body> <%= userinfo.username%> <ul> <%for(var i = 0 ; i < list.length ; i++) {%> <li><%= list[i]%></li> <%}%> </ul> </body> </html>更多有关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介绍——阮一峰