express-7 请求和响应对象(2)
获取更多信息###
如果正在寻找某些功能,首先要查看Express的API文档
如果需要的信息没在文档中,有时就不得不深入研究Express源码; 下面是Express源码的路径说明
lib/application.js
Express主接口。如果想了解中间件是如何接入的,或视图是如何被渲染的,可以看这里。lib/express.js
这是一个相对较短的shell,是lib/application.js中Connect的功能性扩展,它返回一个函数,可以用http.createServer
运行Express应用。lib/request.js
扩展了Node的http.IncomingMessage
对象,提供了一个稳健的请求对象。关于请求对象属性和方法的所有信息都在这个文件里。lib/response.js
扩展了Node的http.ServerReponse
对象,提供响应对象。关于响应对象的所有属性和方法都在这个文件里。lib/router/route.js
提供基础路由支持。尽管路由是应用的核心,但这个文件只有不到200行,你会发现它非常地简单优雅。在你深入研究Express源码时,或许需要参考Node文档,尤其是HTTP模块部分;
内容渲染###
大多数情况下,渲染内容用res.render,它最大程度地根据布局渲染视图。如果想写一个快速测试页,也许会用到res.send
。你可以使用req.query
得到查询字符串的值,使用req.session
得到会话值,或使用req.cookie/req.singedCookies
得到cookies值。
- 基本用法
//基本用法
app.get('/about', function(req, res){
res.render('about');
});
- 200以外的响应代码
app.get('/error', function(req, res){
res.status(500);
res.render('error');
});
//或是一行...
app.get('/error', function(req, res){
res.status(500).render('error');
});
- 将上下文传递给视图,包括查询字符串、cookie和session值
app.get('/greeting', function(req, res){
res.render('about', {
message: 'welcome',
style: req.query.style,
userid: req.cookie.userid,
username: req.session.username,
});
});
- 没有布局的视图渲染
//下面的layout没有布局文件,即views/no-layout.handlebars
//必须包含必要的HTML
app.get('/no-layout', function(req, res){
res.render('no-layout', { layout: null });
});
- 使用定制布局渲染视图
// 使用布局文件views/layouts/custom.handlebars
app.get('/custom-layout', function(req, res){
res.render('custom-layout', { layout: 'custom' });
});
- 渲染纯文本输出
app.get('/test', function(req, res){
res.type('text/plain');
res.send('this is a test');
});
- 添加错误处理程序
//这应该出现在所有路由方法的结尾
//需要注意的是,即使你不需要一个“下一步”方法
//它也必须包含,以便Express将它识别为一个错误处理程序
app.use(function(err, req, res, next){
console.error(err.stack);
res.status(500).render('error');
});
- 添加一个404处理程序
//这应该出现在所有路由方法的结尾
app.use(function(req, res){
res.status(404).render('not-found');
});
处理表单###
当处理表单时,表单信息一般在req.body
中(或者偶尔在req.query
中)。可以使用req.xhr
来判断是AJAX请求还是浏览请求
- 基本表单处理
//必须引入中间件body-parser
app.post('/process-contact', function(req, res){
console.log('Received contact from ' + req.body.name +
' <' + req.body.email + '>');
//保存到数据库....
res.redirect(303, '/thank-you');
});
- 更强大的表单处理
//必须引入中间件body-parser
app.post('/process-contact', function(req, res){
console.log('Received contact from ' + req.body.name +
' <' + req.body.email + '>');
try {
//保存到数据库....
return res.xhr ?
res.render({ success: true }) :
res.redirect(303, '/thank-you');
} catch(ex) {
return res.xhr ?
res.json({ error: 'Database error.' }) :
res.redirect(303, '/database-error');
}
});
提供一个API###
如果提供一个类似于表单处理的API,参数通常会在req.query
中,虽然也可以使用req.body
。与其他API不同,这种情况下通常会返回JSON、XML或纯文本,而不是HTML。你会经常使用不太常见的HTTP方法,比如PUT、POST和DELETE。
- “产品”数组(通常是从数据库中检索):
var tours = [
{ id: 0, name: 'Hood River', price: 99.99 },
{ id: 1, name: 'Oregon Coast', price: 149.95 },
];
- 简单的GET节点,只返回JSON数据
app.get('/api/tours'), function(req, res){
res.json(tours);
});
- 根据客户端的首选项,使用Express中的res.format方法对其响应。GET节点,返回JSON、XML或text
app.get('/api/tours', function(req, res){
var toursXml = '<?xml version="1.0"?><tours>' +
products.map(function(p){
return '<tour price="' + p.price +
'" id="' + p.id + '">' + p.name + '</tour>';
}).join('') + '</tours>'';
var toursText = tours.map(function(p){
return p.id + ': ' + p.name + ' (' + p.price + ')';
}).join('\n');
res.format({
'application/json': function(){
res.json(tours);
},
'application/xml': function(){
res.type('application/xml');
res.send(toursXml);
},
'text/xml': function(){
res.type('text/xml');
res.send(toursXml);
}
'text/plain': function(){
res.type('text/plain');
res.send(toursXml);
}
});
});
- PUT节点更新一个产品信息然后返回JSON。参数在查询字符串中传递(路由字符串中的'':id''命令Express在
req.params
中增加一个id属性)。用于更新的PUT节点
//API用于更新一条数据并且返回JSON;参数在查询字符串中传递
app.put('/api/tour/:id', function(req, res){
var p = tours.some(function(p){ return p.id == req.params.id });
if( p ) {
if( req.query.name ) p.name = req.query.name;
if( req.query.price ) p.price = req.query.price;
res.json({success: true});
} else {
res.json({error: 'No such tour exists.'});
}
});
- 用于删除的DEL节点
// API用于删除一个产品
api.del('/api/tour/:id', function(req, res){
var i;
for( var i=tours.length-1; i>=0; i-- )
if( tours[i].id == req.params.id ) break;
if( i>=0 ) {
tours.splice(i, 1);
res.json({success: true});
} else {
res.json({error: 'No such tour exists.'});
}
});
express-7 请求和响应对象(2)的更多相关文章
- Node+Express中请求和响应对象
在用 Express 构建 Web 服务器时,大部分工作都是从请求对象开始,到响应对象终止. url的组成: 协议协议确定如何传输请求.我们主要是处理 http 和 https.其他常见的协议还有 f ...
- 【Express】请求和响应对象
浏览器发送的信息 app.get('/headers', function(req, res){ res.set('Content-Type', 'text/plain'); var s = ''; ...
- CakePHP之请求与响应对象
请求与响应对象 请求与响应对象在 CakePHP 2.0 是新增加的.在之前的版本中,这两个对象是由数组表示的,而相关的方法是分散在RequestHandlerComponent,Router,Dis ...
- express-6 请求和响应对象(1)
URL的组成部分 协议: 协议确定如何传输请求.我们主要是处理http和https.其他常见的协议还有file和ftp. 主机名: 主机名标识服务器.运行在本地计算机(localhost)和本地网络的 ...
- Python Requests-学习笔记(11)-请求与响应对象
任何时候调用requests.*()你都在做两件主要的事情.其一,你在构建一个 Request 对象, 该对象将被发送到某个服务器请求或查询一些资源.其二,一旦 requests 得到一个从 服务器返 ...
- Django请求响应对象
请求与响应对象 HttpRequest HttpRequest存储了客户请求的相关参数和一些查询方法. path 请求页面的全路径,不包括域名-例如, "/hello/". met ...
- HeadFirst Jsp 04 (请求和响应作为servlet)
servlet 的存在就是为了客服服务, servlet的任务是得到一个客户的请求, 再发回一个响应. 由上图可知, web 容器会在启动后就加载所有的servlet类, 并为之创建实例和初始化 注意 ...
- Servlet请求和响应
在Java Web中Servlet.请求和响应是最基本的三个对象,在Web容器的管理下,这三者能够完成基本的HTTP请求处理. Servlet的作用是为客户提供服务.servlet的角色是接受一个客户 ...
- flask之请求与响应、闪现(阅后即焚)、请求扩展(before,after)、中间件、LOCAL对象、偏函数、
目录 1.flask请求与响应 2.闪现 3.请求扩展 4.中间件 5.LOCAL对象 6.偏函数 templates 1.flask请求与响应 from flask import Flask,req ...
随机推荐
- vs2013显示行号
随便打开一个项目,可以看到代码框内并没有显示行号 选择“工具”-“选项”,打开后界面如下 选择文本编辑器,找到下图中的“行号”并勾选 行号可以显示了 5 这样我们就完成了任务
- Bundle savedInstanceState的作用
写过Android程序的都知道Activity中有一个名称叫onCreate的方法.该方法是在Activity创建时被系统调用,是一个Activity生命周期的开始.可是有一点容易被忽视,就是onCr ...
- 【python】入门学习(三)
for循环 for i in range(): #注意冒号 range中默认从0开始 或者从指定的数字开始 到给定数字的前一个数字结束 递增递减皆是如此 for循环提供变量的自动初始化 for i ...
- 解决win10装不了wifi驱动
右击,选择更新程序驱动软件 ok 好了
- 解决eclipseMavne的web项目debug时没有源码
- python基础——使用__slots__
python基础——使用__slots__ 正常情况下,当我们定义了一个class,创建了一个class的实例后,我们可以给该实例绑定任何属性和方法,这就是动态语言的灵活性.先定义class: cla ...
- Mysql 调用存储过程的两种方式
一,使用call语句: 如:创建 call 调用: 使用占位符,通过prepare,execute调用:
- Jmeter 中通过(_time函数)获取10位时间戳的方法
meter的__time函数作用是取当前时间的时间戳,默认取的时间精确到了毫秒级别,所以获取的时间戳默认是13位的. 下图为取10位的时间戳的函数表达式(时间精确到秒)
- ACM训练计划建议(写给本校acmer,欢迎围观和指正)
ACM训练计划建议 From:freecode# Date:2015/5/20 前言: 老师要我们整理一份训练计划给下一届的学弟学妹们,整理出来了,费了不少笔墨,就也将它放到博客园上供大家参考. 菜 ...
- GMap.Net开发之地址解析与路径查找
上一篇介绍了如何在GMap地图上添加多边形,这篇介绍下如何使用在线的地图服务进行“地址解析”和“路径查找”. 先看地址解析,GMap中的地址解析主要用到GeocodingProvider中的如下方法: ...