Express是一个简洁、灵活的node.js Web应用开发框架,是目前最流行的基于Node.js的Web开发框架. 它提供一系列强大的功能,比如:
还可以使用其他模块来帮助你创建各种Web和移动设备应用
本地安装
$ npm install express
获取、引用
通过变量app
我们就可以调用express
的各种方法
var express = require('express');
var app = express();
app.listen(3000);
思考: express的本质上是什么,是如何工作的
根据请求路径来处理客户端发出的GET请求 语法
app.get(path,function(request, response));
path
为请求的路径var express = require('express');
var app = express();
app.get('/',function(req,res){
res.end('welcome to 首页');
});
app.get('/about',function(req,res){
res.end('欢迎来到关于我们');
})
app.listen(3000);
思考: app.get 的原理
app.all()函数可以匹配所有的HTTP动词
路由中的星号能匹配所有的路径
语法
app.all(path,function(request, response));
示例
var express = require('express');//引入express
var app = express();
app.all("*",function(req,res){
res.send("404");
})
app.listen(3000);
- 访问 /signup 返回字段符串 "注册"
- 访问 /signin 返回字段符串 "登录"
- 访问 /signout 返回字段符串 "退出"
- 访问其它路径,返回字符串 "你访问的路径不存在"
app.get('/',function(req,res){
res.end('欢迎来到首页'+req.host+" "+req.path);
});
//http://localhost:3000/?a=1&b=2&c=3
app.get('/',function(req,res){
res.end(util.inspect(req.query));
});
req.params可以用来获取请求URL中的参数值
app.get('/:id/:name',function(req,res){
res.send(req.params.id+" "+req.params.name);
});
中间件就是处理HTTP请求的函数,用来完成各种特定的任务 比如检查用户是否登录、检测用户是否有权限访问等,它的特点是:
next
参数是一个函数,调用它表示调用后续的中间件,并将数据传递给下一个中间件.var express = require('express');
var app = express();
var path = require('path');
app.use(function(req,res,next){
res.setHeader('Content-Type','text/plain;charset=utf-8');
next();
});
app.get('/',function(req,res){
res.end('首页');
});
app.get('/about',function(req,res){
res.end('关于我们');
});
app.listen(3000);
编写一个请求日志中间件,不管客户端访问什么路径,都在控制台打印出 方法名 路径
send
方法向浏览器发送一个响应信息,并可以智能处理不同类型的数据
并在输出响应时会自动进行一些设置,比如HEAD信息、HTTP缓存支持等等。
语法
res.send([body|status], [body])
示例 1.当参数为一个String时,Content-Type默认设置为"text/html"。
res.send('Hello World'); //Hello World
2.当参数为Array或Object时,Express会返回一个JSON
res.send({ user: 'tobi' }); //{"user":"tobi"}
res.send([1,2,3]); //[1,2,3]
3.当参数为一个Number时,并且没有上面提到的任何一条在响应体里,Express会帮你设置一个响应体,比如:200会返回字符"OK"
require('_http_server').STATUS_CODES
res.send(200); // OK
res.send(404); // Not Found
res.send(500); // Internal Server Error
在nodejs中使用express框架,它默认的是ejs和jade渲染模板
npm install ejs
使用ejs模板
//指定渲染模板文件的后缀名为ejs
app.set('view engine', 'ejs');
app.set('views',path.join(__dirname,'views'));
res.render('index');
模板使用html后缀
// 修改模板文件的后缀名为html
app.set( 'view engine', 'html' );
app.set('views',path.join(__dirname,'views'));
// 运行ejs模块
app.engine( '.html', require( 'ejs' ).__express ); //__express是ejs模块的一个公共属性,表示要渲染的文件扩展名
语法
view
就是模板的文件名locals
可为其模板传入变量值callback
用来处理返回的渲染后的字符串res.render(view, [locals], callback);
var tmpl = '<h1>{{name}}</h1><h1>{{age}}</h1>';
var data = {name:'zfpx',age:30};
var html= tmpl.replace(/\{\{(\w+)\}\}/g,function(input,group){
return data[group];
})
console.log(html);
如果要在网页中加载静态文件(css、js、img),就需要另外指定一个存放静态文件的目录,当浏览器发出非HTML文件请求时,服务器端就会到这个目录下去寻找相关文件
app.use(express.static(path.join(__dirname,'/')));
redirect方法允许网址的重定向,跳转到指定的url并且可以指定status,默认为302方式。 语法
res.redirect([status], url);
示例
res.redirect("http://www.baidu.com");
实现一个注册登录的功功,描述如下
curl -H 'content-type:application/json;charset=utf-8' http://localhost:8080/users
curl -X POST http://localhost:8080/users
curl --data "name=zfpx&age=8" http://localhost:8080/users
// 当请求到来的时候执行app,这是会对数组里的配置项一次匹配,匹配上的执行,匹配不上执行
var app = function(req,res){
var i=0;//定义一个变量每次执行next后加一
//每执行一次next,会取出一个中间件函数执行,并且把next传进去
function next(){
var fn = app.routes[i++];
if(fn)
fn(req,res,next);
}
next();
}
//存放中间件函数的数组
app.routes = [];
//配置函数
app.use = function(fn){
//往数组里添加函数
app.routes.push(fn);
}
//------------------------
app.use(function(req,res,next){
console.log(req.url);
console.log(1);
next();
});
app.use(function(req,res,next){
console.log(2);
res.end('ok');
next();
});
//-------------------
var http = require('http');
var server = http.createServer(app);
server.listen(9090);
//是路由里的路径
var path = '/users/:name/:age';
//真实请求的URL
var url = '/users/zfpx/8';
//存放所有的参数名
var paramNames = [];
var regStr = path.replace(/:(\w+)/g,function(matchedStr,group1){
paramNames.push(group1);// name age 添加进来的
return '(\\w+)';
});
console.log(regStr);// \/users\/(\w+)\/(\w+)
var reg = new RegExp(regStr);
var result = url.match(reg);
//[ '/users/zfpx/8', 'zfpx', '8', index: 0, input: '/users/zfpx/8' ]
console.log(result);
var params = {};
//循环数组名 值就是 result中的分组
for(var i=0;i<paramNames.length;i++){
params[paramNames[i]] = result[i+1];
}
console.log(params);