Node.js+Webpack开发实战
上QQ阅读APP看书,第一时间看更新

4.5 响应对象

每个路由函数都会接收一个响应对象,通过调用响应对象的方法,可以将响应发送到客户端,并结束请求处理。如果路由函数未调用响应对象的任何方法,则客户端请求将被挂起,直到客户端超时。

下面的内容介绍了响应对象常用的操作。

1.resp.status()

设置响应状态码。

resp.status(statusCode);

· statusCode响应状态码

以下是响应403状态码的示例:

app.get('/', (req, resp) => {
  resp.status(403).end();
});
2.resp.set()

设置响应报头。要一次设置多个响应报头字段,需要传递对象作为参数。

resp.set(field[, value])

resp.set({
  [field]: value
});

· field:响应报头字段名称。

· value:响应报头字段值。

以下是设置响应类型为纯文本的示例:

app.get('/', (req, resp) => {
  resp.set('Content-Type', 'text/plain');
  resp.send('Hello World');
});
3.resp.download()

通过Content-Disposition响应报头提示客户端下载文件。

resp.download(path[, filename][, options][, callback])

· path:需要提供给客户端下载的服务端文件路径。

· filename:客户端下载文件时的别名。

· options:下载选项。

· callback:回调函数。

以下是一个下载PDF的示例:

4.resp.end()

结束响应过程。

resp.end([chunk][, encoding][, callback])

· chunk:响应数据。

· encoding:响应体编码。

· callback:回调函数。

以下是一个输出Hello World并结束请求的示例:

app.get('/', (req, resp) => {
  resp.end('Hello World');
});
5.resp.redirect()

重定向到指定的URL Path或者完整的URL链接。默认情况下响应状态码为302。

resp.redirect([status,] path)

· status:响应状态码,301或者302。

· path:重定向路径。

以下是重定向到登录页面的示例:

app.get('/user/home', (req, resp) => {
 resp.redirect('/user/login');
});

以下是使用301(永久重定向)状态码将文章重定向的示例:

app.get('/news/2019/10/01.html', (req, resp) => {
 resp.redirect(301, '/news/2019/10-01.html');
});

以下是重定向到外部网域的示例:

app.get('/', (req, resp) => {
  resp.redirect('https://www.ddhigh.com');
});
6.resp.render()

渲染HTML模板页面。

渲染模板页面需要使用到模板引擎,关于模板的详细内容将在后续内容介绍。

resp.render(view[,locals][,callback])

· view:视图名称。

· locals:传递到视图的变量对象,视图可以访问到这些变量并进行渲染。

· callback:回调函数。如果提供,该方法将返回可能的错误和HTML字符串,但不是自动发送HTML到客户端。

以下是渲染用户主页的示例:

app.get('/user/home', (req, resp) => {
   resp.render('user/home', { name: 'xialei' });
});
7.resp.cookie()

设置Cookie。

resp.cookie(name, value[, options])

· name:Cookie名称。

· value:Cookie值。

· options选项:

 domain:域名。默认为当前域名。

 expires GMT:到期时间。如果未设置或者设置为0,则浏览器关闭后Cookie失效。

 httpOnly:将Cookie标记为只有HTTP服务器能访问(客户端JS无法访问)。

 maxAge:以毫秒为单位的过期时间。通常比expires选项使用方便。

 path:Cookie路径。

 secure:标记为仅在HTTPS协议下才发送。

 signed:是否对Cookie签名。

以下是设置用户登录态cookie的示例:

调用cookie并不会终止请求处理流程,需要调用其他方法来终止请求处理,否则客户端请求会挂起直到超时。

8.resp.send()

发送HTTP响应。该方法可以根据传入的内容来输出不同格式的响应内容。

resp.send([body])

· body响应内容。支持string、Buffer、Object、Array。

 String:Content-Type将自动设置为text/html。

 Buffer:Content-Type将自动设置为application/octet-stream。

 Object或Array:Content-Type将自动设置为application/json。

以下是响应JSON的示例:

app.get('/', (req, resp) => {
  resp.send({name: 'xialei'});
});

以下是响应文本的示例:

app.get('/', (req, resp) => {
 resp.send('Hello World');
});