/** * Created by liyanq on 17/3/31. * http.IncomingMessage 类 */ /* 原生的部分 * 1,继承:req:IncomingMessage->Readable->events.EventEmitter * * 事件 * 1,'aborted' 事件:当请求已被客户端中止且网络 socket 已关闭时触发。 * 2,'close' 事件:表明底层连接被关闭。 就像 'end',该事件每次响应只发生一次。 * 在http.ServerResponse对象的end方法被调用之前,如果连接被中断,将触发http.ServerResponse对象的close事件. * 同时也会触发aborted事件 * * 3,message.headers:请求/响应头的对象。报头名称和值的键值对。 报头名称为小写。 * 4,message.httpVersion:可能的值有 '1.1' 或 '1.0'。 * 5,message.method:请求方法是一个字符串。 只读。 例如:'GET'、'DELETE'。 * 6,message.rawHeaders:接收到的原始请求/响应头列表。看的很不爽~ * 7,message.rawTrailers:接收到的原始的请求/响应报尾的键和值。 只在 'end' 事件时填入(没试验出~) * 8,message.setTimeout(msecs, callback)//客户端用。 * 9,message.statusCode//仅客户端用~ * 10,message.statusMessage//HTTP 响应状态消息(原因描述)。仅客户端用~ * 11,message.url//请求的 URL 字符串。 仅包含 HTTP 请求实际存在的 URL。仅服务器用~ * 如:/?name='baidu2'&url='www.baidu2.com' * 12,message.destroy([error]) * 客户端:中断请求,能够触发服务器的close和aborted事件 * 服务器:对该次请求停止响应,触发服务器的close和aborted事件的同时,客户端也能触发error事件 *------------------------------------------------------------------------------------------------ * express部分 * 由于框架中的属性有的通过defineGetter定义,以及在router中又扩展了request对象, * 所以框架下的req都联想不出来. * 1,req.app:返回app的引用,如:req.app.get("views")) * 2,req.baseUrl:可以理解为上层路由,它由express/lib/router/index.js提供~ * 3,req.body:请求的体,针对post请求。它由body-parser中间件提供~ * application.use(bodyParser.json());这个写法支持json的格式. * IOS注意请求数据类型;客户端注意设置headers: {"Content-Type": "application/json"} * 4,req.cookies:它由cookie-parser中间件提供 * cookies原理 * 1:一定是放在浏览器中的,用于浏览器保存一些小额度的内容。 * 2:每次我们去访问服务器的时候,cookie都会附着在请求报文中,一起发送给服务器。 * 3:服务器中没有cookie,它只是操作浏览器发送过来的cookie而已。 * 4:也因为如此,我们在服务器端的代码中处理cookie的时候,比如变更某个cookie的值, * 其实这个更改对于浏览器而言,还没有生效,一定要返回到浏览器中,才会将这个更改真正实施。 * 当然,在服务器端中,跟更改一个其他变量,比如session,没有什么两样,改了就是改了。 * * 5,req.fresh:这个属性是通过fresh来完成的(fresh用来判断req,res中的HTTP头是否依然有效), * 6,req.hostname:获取主机名称 * 7,req.ip:主机地址 * 8,req.originalUrl:原始的url地址,域名后的都算~(这个以后用到很多,再练习) * 9,req.path:最后的路径 * 10,req.protocol:协议 * 11,req.params:url参数名称(这个以后用到很多,再练习) * 12,req.query:这个厉害了~(这个以后用到很多,再练习) * GET /search?q=tobi+ferret * req.query.q => "tobi ferret" * GET /shoes?order=desc&shoe[color]=blue&shoe[type]=converse * req.query.order => "desc" * req.query.shoe.color => "blue" * req.query.shoe.type => "converse * 13,req.route:返回当前匹配的route对象。(这个以后用到很多,再练习) * 14,req.signedCookies:签了名的cookie * * */ const expressReq = { ip: "someIp" }; var express = require("express"); var application = express(); var path = require("path"); const hostName = "127.0.0.1"; const port = 3000; var router1 = express.Router(); var router2 = express.Router(); application.set('views', path.join(__dirname, 'views')); application.use('/r1', router1); router1.use('/r2', router2); router2.get('/main', function (req, res) { res.status(200); console.log(req.ip); console.log(req.route); console.log({ path: req.path, baseUrl: req.baseUrl, originalUrl: req.originalUrl, url: req.url }); /*{ path: '/main', baseUrl: '/r1/r2', originalUrl: '/r1/r2/main', url: '/main' }*/ res.send("The views directory is 对方答 " + req.app.get("views")); }); var greet = express.Router(); greet.get('/jp', function (req, res) { console.log(req.baseUrl); // /greet res.send('baseUrl:' + req.baseUrl); }); application.use('/greet', greet); var bodyParser = require('body-parser'); var cookieParser = require('cookie-parser'); application.use(bodyParser.json()); // for parsing application/json application.use(cookieParser()); application.get("/", function (req, res) { // res.statusCode = 200; res.setHeader("Content-Type", "text/plain;charset=utf-8"); res.setHeader("Set-Cookie", "UserID=JohnDoe; Max-Age=3600; Version=1"); // req.on("aborted", function () { // console.log("aborted事件发生了"); // }); // req.on("close", function () { // console.log("close事件发生了"); // }); // req.destroy(new Error("我不想给这个请求响应数据~")); // console.log(require("url").parse(req.url)); console.log(req.headers); console.log(req.cookies); console.log(req.hostname); setTimeout(function () { //3秒内关闭浏览器,就会触发关闭和中断事件 res.end(); }, 3000); res.end("完成啦~"); }); var server = application.listen(port, hostName, function () { console.log("服务器已经运行:http://%s:%s", hostName, port); });