[NODE之16]express框架response

/**
 * Created by liyanq on 17/3/29.
 * http.ServerResponse 类
 * 这个类非常重要,是给客户端的数据的重要通道。
 * 计划分两部分:原生的对象和express框架下的对象。
 */

/*express下response对象

 * 通过源码可以看出,express下response对象只是扩展了原型对象,
 * 这个对象只能通过express的方法得到,如get,post等.所以说,原生的方法都支持.
 * var res = module.exports = {
 *     __proto__: http.ServerResponse.prototype
 * };
 *
 * 1,继承:res:ServerResponse->OutgoingMessage->Stream->EventEmitter 和原生的一样
 * 2,个人感觉扩展的意义并不大,除了下面4个重点内容~
 *
 *
 * 方法:
 * 1,status:->可以链式,返回引用~
 * res.status(200) 等效 res.statusCode=200
 *
 * 2,links:不知道干什么用的~
 * 3,res.send([body])->(重点1:比原生支持了json)
 *   错误1:一次响应只能用一次这个函数,用两次的话:Error: Can't set headers after they are sent.
 *   错误2:用send发送完,不能再write写信息,否则:Error: write after end
 *   错误3:用write写完信息,也不能用send,否则:Error: Can't set headers after they are sent.
 *
 *   能够发送各种响应体,如下:
 *   res.send(new Buffer('whoop'));
 *   res.send({ some: 'json' });
 *   res.send('<p>some html</p>');
 *   res.status(404).send('Sorry, we cannot find that!');
 *   res.status(500).send({ error: 'something blew up' });
 *
 * 4,res.json([body])->发送一个 JSON 格式的响应。
 * 5,res.jsonp:发送一个支持 JSONP 的 JSON 格式的响应。
 *   没试验出来,查了下,是为了支持跨域请求,以后再说吧~
 *
 * 6,res.sendStatus:设置响应状态代码,并将其以字符串形式作为响应体的一部分发送。
 *   注意的是,这个方法里面调用了send方法,send方法的注意点对它都适合~
 * res.sendStatus(200); // equivalent to res.status(200).send('OK')
 * res.sendStatus(403); // equivalent to res.status(403).send('Forbidden')
 * res.sendStatus(404); // equivalent to res.status(404).send('Not Found')
 * res.sendStatus(500); // equivalent to res.status(500).send('Internal Server Error')
 *
 * 7,sendFile(path, options, callback):以八位字节流的形式发送文件。(重点2:原生没这个~)
 *   注意的是,sendFile内部也调用了res.end(),所以send方法的注意点对它都适合~
 *   还有就是path参数是文件的绝对路径,包括文件名。
 *   单独的sendFile也能处理完这次的响应,也能触发finish事件,不用再res.end()了。
 *
 * 8,res.download(path [, filename] [, fn]):提示下载文件。(重点3:原生没这个~)
 *   注意的是,内部调用了sendFile,所以sendFile注意点它都适合。
 *
 *   sendFile和download的区别:
 *   1,浏览器收到sendFile的文件会直接打开(适合的大小和类型),而download则都是用浏览器下载.
 *   2,download能命名下载文件的名字。
 *
 * 9,res.contentType =res.type = function contentType(type):就是给设置Content-Type头信息提供了一个属性。
 *   返回内容的MIME类型;如:Content-Type: text/html; charset=utf-8
 *
 * 10,format:function(obj):根据Content-Type类型做出响应~
 * 11,attachment: Content-disposition 是 MIME 协议的扩展,MIME 协议指示 MIME 用户代理如何显示附加的文件。
 *    当 Internet Explorer 接收到头时,它会激活文件下载对话框,它的文件名框自动填充了头中指定的文件名。
 *    (请注意,这是设计导致的;无法使用此功能将文档保存到用户的计算机上,而不向用户询问保存位置。)
 *    http://www.cnblogs.com/brucejia/archive/2012/12/24/2831060.html
 *    注意的是,执行send后,就不能再执行attachment函数了,但可以先执行send();
 * 12,append:追加头信息
 * 13,res.set = res.header = function header(field, val)
 *
 * 14,res.clearCookie = function clearCookie(name, options) {
 *       var opts = merge({ expires: new Date(1), path: '/' }, options);
 *       return this.cookie(name, '', opts);
 *    };
 *    注意的是,不能清除或设置Set-Cookie设置的值,如果浏览器里面没有name的cookie,
 *             那么会新建个cookie,只是有效期是1970年~
 *
 * 15,res.cookie = function (name, value, options)
 * 16,res.location = function location(url):设置头的location的值.
 * 16,res.redirect([status,] path):做跳转;(重点4:原生没这个~)
 *
 *   */

var express = require("express");
var path = require("path");
var application = express();
application.get("/", function (req, res) {
    res.on("finish", function () {
        console.log("下载完成");
    });
    res.status(200);

    /*这三个不冲突,浏览器有三个相同名字的cookie~*/
    res.append('Set-Cookie', 'foo=bar2; Path=/; HttpOnly');
    res.cookie("foo",{name:"Hello Cookie"});
    res.clearCookie("foo");

    res.location("http://www.baidu.com");//设置值
    res.redirect("http://www.baidu.com");//跳转
    /*
     const options = {
     root: path.join(__dirname, "public"),
     dotfiles: 'deny',
     headers: {
     'x-timestamp': Date.now(),
     'x-sent': true
     }
     };
     res.sendFile("buffer.rmvb", options,function () {
     console.log("35.jpg下载完成");
     // res.end();可以不加
     });

     res.download("public/35.jpg", "newDownload.jpg", function () {
     console.log("newDownload.jpg下载完成");
     // res.end();可以不加
     });*/

    /*res.contentType("text/html");
    res.setHeader("Content-Disposition","attachment;filename=fileName.jpg");
    res.format({
        'text/plain': function () {
            res.send('hey');
        },

        'text/html': function () {
            res.send('<p>hey</p>');
        },

        'application/json': function () {
            res.send({message: 'hey'});
        },

        'default': function () {
            // log the request and respond with 406
            res.status(406).send('Not Acceptable');
        }
    });*/

    res.end();
});

var server = application.listen(3000, function () {
    var host = server.address().address;
    var port = server.address().port;

    console.log('Example app listening at http://%s:%s', host, port);
});

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值