[NODE之17]request和express框架request

/**
 * 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);
});
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值