zoukankan      html  css  js  c++  java
  • 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('
    ');
       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.'});
        }
    });
    
  • 相关阅读:
    json-server模拟REST API
    配置mysql使其允许外部ip进行登录
    java版的类似飞秋的局域网在线聊天项目
    微信小程序一键生成源码 在线制作定制功能强大的微信小程序
    nginx下laravel框架rewrite的设置
    高并发服务器架构--SEDA架构分析
    Laravel nginx 伪静态规则
    Laravel配置nginx环境
    Laravel 在 Nginx 中的参考配置两份
    微信小程序wxml和wxss样式
  • 原文地址:https://www.cnblogs.com/jinkspeng/p/4280977.html
Copyright © 2011-2022 走看看