express的中间件有:
Express 4.0 Name
body-parser:解析请求体,相当于cntent-type设置;
compression:压缩;
cookie-session
Morgan:morgan是express默认的日志中间件,也可以脱离express,作为node.js的日志组件单独使用;
cookie-parser:设置cookie;
express-session:设置session;
static-favicon(server-favicon):serve-favicon的中间件,可以用于请求网页的logo。就是地址栏中网址前面出现的小图片;
response-time:响应时间
errorhandler:错误回调
method-override:HTTP伪造中间件
connect-timeout:请求超时中间件
vhost:虚拟二级域名映射中间件
csurf:跨域请求伪造保护中间件
安装:npm install express -g
参考:https://www.cnblogs.com/mq0036/p/5243312.html
http://javascript.ruanyifeng.com/nodejs/express.html
参考二:http://ourjs.com/detail/56b2a6f088feaf2d031d2468
api文档:http://www.expressjs.com.cn/4x/api.html
nodejs文档:https://nodejs.org/dist/latest-v9.x/docs/api/https.html
===========app.js=============
var express = require('express');
var app = express();//创建express实例
var routes=require('./routes/routes.js');//吧路由引入; ./ 代表项目的当前总目录 /Users/wofu/Desktop/node
routes.router(app);//调用路由
var server = app.listen(8081, function () {
var host = server.address().address
var port = server.address().port
console.log(__dirname);//这里的目录就是/Users/wofu/Desktop/node,其中node文件夹我是直接放在了桌面
console.log(host);//主机地址
console.log(port);//端口号
console.log("应用实例,访问地址为 http://%s:%s", host, port)
})
============routes.js=========路由的实现(三种方法)=======中间件的使用===
var router = function(app){
//*********路由实现方法一,一个一个分别写出来**************
// app.get('/one', function(req, res){
// console.log("第一个网页");
// res.send("diyi")
// // res.render('../views/one.html');
// });
//
// app.get('/two', function(req, res){
// console.log("第二个网页");
// res.send("dier")
// // res.render('../views/two.html');
// });
// // 对页面 abcd, abxcd, ab123cd, 等响应 GET 请求,*号代表占位
// app.get('/ab*cd', function(req, res) {
// console.log("/ab*cd GET 请求");
// res.send('正则匹配');
// })
//用use注册中间件
// app.use(function (req,res,next) { // 设置404页面,如果路由不存在,就执行这个监听
// res.status(404);
// res.send('404 - Not Found')
// })
//***********路由实现方法二:用use注册中间件,根据req。url来判断分发路由*******
//use是express注册中间件的方法,它返回一个函数,如果注册了两个中间件。收到HTTP请求后,
//先调用第一个中间件,在控制台输出一行信息,然后通过next方法,将执行权传给第二个中间件,
//输出HTTP回应。由于第二个中间件没有调用next方法;所以request对象就不再向后传递了。
// use方法内部可以对访问路径进行判断,据此就能实现简单的路由,根据不同的请求网址,返回不同的网页内容。
// app.use(function(req, res, next) {
//
// if (req.url == "/one") {
// console.log(req.url);//
// res.writeHead(200, { "Content-Type": "text/plain" });
// console.log("useluyou");
// res.end("ddddd")
// } else {
// next();
// }
// });
//********路由实现方法三:用use注册中间件,第一个参数填写路径***********
// 除了在回调函数内部判断请求的网址,use方法也允许将请求网址写在第一个参数。
// 这代表,只有请求路径匹配这个参数,后面的中间件才会生效。
app.use("/two", function(request, response, next) {
response.writeHead(200, { "Content-Type": "text/plain" });
response.end("Welcome to the about page!\n");
});
app.use(function(request, response) {
response.writeHead(404, { "Content-Type": "text/plain" });
response.end("404 error!\n");
});
// use还有一些别名,如all表示所有请求都必须通过该中间件,参数中的“*”表示对所有路径有效。
// get方法则是只有GET动词的HTTP请求通过该中间件,它的第一个参数是请求的路径。
// 如果get方法的回调函数没有调用next方法,只要有一个中间件被调用了,后面的中间件就不会再被调用了。
// 除了get方法以外,Express还提供post、put、delete方法,即HTTP动词都是Express的方法。
app.all("*", function(request, response, next) {
response.writeHead(200, { "Content-Type": "text/plain" });
next();
});
};
exports.router = router;
//*************路由方式一***********
创建服务器:
var express = require('express');
var app = express();//创建express实例
var routes=require('./routes/get.js');//吧路由引入; ./ 代表项目的当前总目录 /Users/wofu/Desktop/node
// var routes=require('./routes/post.js');//吧路由引入; ./ 代表项目的当前总目录 /Users/wofu/Desktop/node
routes.router(app);//调用路由
var server = app.listen(8081, function () {
var host = server.address().address;
var port = server.address().port;
console.log(__dirname);//这里的目录就是/Users/wofu/Desktop/node,其中node文件夹我是直接放在了桌面
console.log(host);//主机地址
console.log(port);//端口号
console.log("应用实例,访问地址为 http://%s:%s", host, port);
});
路由:
var router = function(app){
var url = require('url');
app.get('/get', function (req, res) {
// res.writeHeader(200, {'Content-Type':'text/html;charset=UTF-8'});
// res.writeHeader(200, {'Content-Type':'text/plain;charset=UTF-8'});
res.writeHeader(200, {'Content-Type':'application/json;charset=UTF-8'});
// res.writeHeader(200, {'Content-Type':'text/json;charset=UTF-8'});
//************获取参数和url
console.log(req.url);//******结果: /get?age=20&name=lambo
console.log(url.parse(req.url).pathname);// ***结果:/get ***需要先引入 var url = require('url');
console.log(url.parse(req.url).query);// ***结果:age=20&name=lambo *** 需要先引入 var url = require('url');
console.log(req.query);//{ name: 'lambo', age: '20' }
console.log(req.query.name);//lambo
//************
// 输出 JSON 格式
var json = JSON.stringify({
msg:"成功",
result:[{
"name":"菜鸟教程",
"site":"http://www.runoob.com"
},{
"name":"新手教程",
"site":"csdnnnn"
}],
status:1
});
// res.write(json);//如果要在浏览器上显示就用这个,并且还要加上res.end()方法;否则网页一直在加载;
res.end(json);//如果要传给前端数据(这时就不能执行 res。write() 方法),一定要用这个方法,这个方法也可以在浏览器上显示;
})
//************post请求*********
var bodyParser = require('body-parser');//解释参考http://blog.csdn.net/yanyang1116/article/details/54847560
// 创建 application/x-www-form-urlencoded 编码解析
var urlencodedParser = bodyParser.urlencoded({ extended: false })
app.post('/post', urlencodedParser, function (req, res) {//第二个参数是用一种解析方式解析
console.log(req.body);//{ age: '20', name: 'lambo' }---body是从客户端传过来的参数
console.log(req.body.name);//lambo----参数name的值
// 输出 JSON 格式
var json = JSON.stringify({
msg:"成功",
result:[{
"name":"菜鸟教程",
"site":"http://www.runoob.com"
},{
"name":"新手教程",
"site":"csdnnnn"
}],
status:1
});
// res.write(json);//如果要在浏览器上显示就用这个,并且还要加上res.end()方法;否则网页一直在加载;
res.end(json);//如果要传给前端数据(这时就不能执行 res。write() 方法),一定要用这个方法,这个方法也可以在浏览器上显示;
});
//**************找不到路由时的处理
app.use(function (req,res,next) { // 设置404页面,如果路由不存在,就执行这个监听
res.status(404);
res.send('404 - Not Found')
});
};
exports.router = router;