3

3. response对象

3.1 是否发送了响应头

  • res.headersSent布尔属性,app是否发送了httpheaders
const express = require('express');
const bodyParser = require('body-parser');
const cookieParser = require('cookie-parser')
const app = express();

app.use(bodyParser.json());// parsing application/json
app.use(bodyParser.urlencoded({ extended: true }));// parsing application/x-www-form-urlencoded
app.use(cookieParser())

app.get('/', (req, res) => {
    console.log(res.headersSent); // false
    res.send('OK');
    console.log(res.headersSent); // true
})
app.listen(3000);

3.2 添加响应头信息

  • res.append(filed,[value])添加响应头信息
  • 使用res.append()之后调用res.set()将会重置先前设置的头信息
const express = require('express');
const app = express();
app.get('/', (req, res) => {
    console.log(res.headersSent); // false
    res.append('Link', ['<http://localhost/>', '<http://localhost:3000/>']);
    res.append('Set-Cookie', 'foo=bar; Path=/; HttpOnly');
    res.append('Warning', '199 Miscellaneous warning');
    res.attachment('path/to/logo.png');
    res.cookie('user', { name: 'Jack', age: 18 });
    res.cookie('maxAge', 1000 * 60 * 60 * 24 * 30);
    res.send('OK');
    console.log(res.headersSent); // true
})
app.listen(3000);

3.3 设置HTTP响应Content-Disposition字段attachment

  • res.attachment([filename])
  • 设置HTTP响应Content-Disposition字段attachment
  • 如果参数为空,那么设置Content-Disposition:attachment
  • 如果参数有值,那么将基于res.type()扩展名设置Content-Type的值,并且设置Content-Disposition的值为参数值
res.attachment();
// Content-Disposition: attachment

res.attachment('path/to/logo.png');
// Content-Disposition: attachment; filename="logo.png"
// Content-Type: image/png

response响应头信息

3.4 设置cookie信息

  • res.cookie(name, value, [options])
  • 清除cookie信息res.clearCookie(name, [options])
  • 设置cookienamevalue,value值可以是stringobject,options是一个对象
  • domain,string,cookie的域名,默认为该app的域名
  • expires,date,过期时间
  • httpOnly,boolean,cookie的标志位,只能允许http web server
  • maxAge,string,用于设置过期时间相对于当前时间 (以毫秒为单位) 的选项.
  • path,string,cookie的路径,默认为/
  • secure,boolean,标记只用于HTTPScookie.
  • signed,boolean,指示是否应对cookie进行签名.(有问题,需要cookie-parser)
所有的res.cookie ()都是用所提供的选项设置HTTP设置cookie头.任何未指定的选项都默认为RFC 6265中所述的值.
使用cookie-parser中间件时, 此方法还支持签名的cookie.只需将签名的选项设置为 true.然后,res cookie ()将使用传递给cookieParser(秘密) 的秘密来签署该值.

3.5 响应下载信息

  • res.download(path, [filename], [callback(err){...}])
const express = require('express');
const app = express();
app.get('/', (req, res) => {
    res.download('static/download/file.pdf', 'file.pdf', (err) => {
        if (err) {
            res.send(err);
        }
    });
})
app.listen(3000);

3.6 结束响应进程

  • res.end([data], [encoding])
  • 不需要返回任何数据,如果需要返回数据,可以使用res.send()或者res.json()

3.7 获取请求头信息

  • res.get(field)
  • 通过字段返回HTTP请求头信息,大小写敏感
res.get('Content-Type');
// => "image/png"

3.8 发送一个JSON响应

  • res.json([body])
  • 方法类似于带有一个对象参数或数组参数的res.send()
  • 参数也可以为null或者undefined
res.json(null)
res.json({ user: 'tobi' })
res.status(500).json({ error: 'message' })

3.9 填充响应的链接HTTP标题头字段

  • res.links(links)
res.links({
    next: 'http://localhost:3000/users?page=2',
    next: 'http://localhost: /users?page=5'
})

3.10 响应重定向

  • res.redirect([status], path)
  • 如果不指定status状态,默认状态码status code302 Found
  • 如果要跳转到外部的链接,需要加上http://
  • 返回上一步的页面res.redirect('back');
  • 返回上一级的页面,如果现在是在http://example.com/admin/post/new页面,想要跳转到上一级页面http//example.com/admin/post,使用res.redirect('..');
res.redirect('/users');
res.redirect(301, 'http://localhost:3000/login')

3.11 渲染模板引擎

  • res.render(view, [locals], [callback(err,html){...}])
  • 模板引擎一般有ejs,jade,html

3.12 发送HTTP响应信息

  • res.send([body])
  • 参数可以是String,Buffer,Array
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' });

3.13 给定路径上传输文件

  • res.sendFile(path, [options], [callback(err){...}])
  • 根据文件名的扩展名设置内容类型响应HTTP标头字段.除非在选项对象中设置了根选项, 否则路径必须是文件的绝对路径.
  • options是一个对象选项
  • maxAge,以毫秒为单位设置Cache-Control标题头的最大属性或ms格式的字符串,默认为0
  • root,相对文件名的根目录
  • lastModified,将Last-Modified的标题头设置为操作系统上文件的最后修改日期.设置为false以禁用它.
  • headers,包含要与文件一起服务的HTTP标头的对象.
  • dotfiles,服务dotfiles的选项.可能的值是allow,deny,ignore,默认值为ignore
router.get('/file/:name', (req, res, next) => {
    let options ={
        root: './public/static/download/',
        dotfiles: 'deny',
        headers: {
            'x-timestamp': Date.now(),
            'x-sent': true
        }
    };
    
    let fileName = req.params.name;
    res.sendFile(fileName, options, (err) => {
        if(err){
            console.log(err);
            res.status(err.status).end();
        }else{
            console.log('Sent: ',fileName)
        }
    })
});

3.14 设置状态代码

  • res.sendStatus(statusCode)
  • 将响应HTTP状态代码设置为statusCode, 并将其字符串表示形式作为响应正文发送.
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')

3.15 设置响应头信息

  • res.set(field, [value])
  • 可以单个设置,也可以用一个对象设置
res.set('Content-Type', 'text/plain');

res.set({
  'Content-Type': 'text/plain',
  'Content-Length': '123',
  'ETag': '12345'
})

3.16 设置响应状态

  • res.status(code)
  • 使用此方法可设置响应的HTTP状态.它是节点响应的式别名statusCode
res.status(403).end();
res.status(400).send('Bad Request');
res.status(404).sendFile('/absolute/path/to/404.png');

3.17 设置响应类型

  • res.type(type)
  • 将内容类型HTTP标头设置为指定类型的mime.lookup()所确定的mime类型。如果type包含/字符, 则将Content-Type设置为type
res.type('.html');              // => 'text/html'
res.type('html');               // => 'text/html'
res.type('json');               // => 'application/json'
res.type('application/json');   // => 'application/json'
res.type('png');                // => 'image/png:'

3.18 添加字段到不同的响应头

  • res.vary(filed)
  • 将该字段添加到不同的响应标头 (如果它尚未存在)。
res.vary('User-Agent').render('docs');

karuru
329 声望64 粉丝