zoukankan      html  css  js  c++  java
  • express for node 路由route几种实现方式的思考


    1、路由实现方式和顺序

    express框架创建的模板app,js中默认代码

    var express = require('express');
    var routes = require('./routes');
    var user = require('./routes/user');
    var http = require('http');
    var path = require('path');
    
    var app = express();
    
    // all environments
    app.set('port', process.env.PORT || 3000);
    app.set('views', __dirname + '/views');
    app.set('view engine', 'ejs');
    app.use(express.favicon());
    app.use(express.logger('dev'));
    app.use(express.bodyParser());
    app.use(express.methodOverride());
    app.use(app.router);
    app.use(express.static(path.join(__dirname, 'public')));
    
    // development only
    if ('development' == app.get('env')) {
      app.use(express.errorHandler());
    }
    
    app.get('/', routes.index);
    app.get('/users', user.list);
    
    http.createServer(app).listen(app.get('port'), function(){
      console.log('Express server listening on port ' + app.get('port'));
    });


    其中以下两句尤其重要,对路由产生影响

    app.use(app.router);
    app.use(express.static(path.join(__dirname, 'public')));

    (1)express.static指定了静态页面的查找目录,如果定义express.static('/var/www'),当用户向node请求http://server/file.html,node将会自动查找http://server/file.html
    (2)两句的前后顺序决定了当静态页面和动态路由都存在时,哪个决定node的真实路由

    假设在静态目录下存在test.html,同时包含

    app.get('/test.html', function(req, res) {
        res.send('Hello from route handler');
    });


    方式1:

    app.use(app.router);
    app.use(express.static(path.join(__dirname, 'public')));


    则浏览器看到的结果是Hello from route handler

    方式2:

    app.use(express.static(path.join(__dirname, 'public'))); app.use(app.router);

    则浏览器看到的结果是显示test.html内容

    方式3:

    exports.index=function(req,res){
    	res.render('index',{title:'Express'});
    }

    app.use(express.static(path.join(__dirname, 'public'))); //app.use(app.router); //注释掉

    同时删除test.html文件

    则浏览器看到的结果是显示Hello from route handler,说明其实写不写这句,express都是会默认执行的

    express官方推荐的是方式1的写法,之所以这样做,是考虑到性能问题,不论方式2或方式3,都要首先读写磁盘查找文件,没有匹配文件后然后找路由,而方式1,如果有匹配的路由,则不必去查找磁盘,磁盘的IO操作是必然费时效率低下的。


    2、第二种路由写法

    上述的路由方式,都是写在app.js里,当路由的内容不断增加时,可读性变差

    所以有了第二种写法:

    app.js

    var routes = require('./routes');
    app.get('/',routes.index);


    routes/index.js

    exports.index=function(req,res){
    	res.render('index',{title:'Express'});
    }

    3、第三种路由写法(最佳)

    app.js  
    routes(app);//最佳

    app.use(express.router(routes));

    routes/index.js
    module.exports = function(app){
      app.get('/',function(req,res){
        res.render('index', { title: 'Express' });
      });
      app.get('/reg', function(req, res) {
        res.render('reg', {
          title: '用戶註冊',
        });
      });
    };



    参考http://stackoverflow.com/questions/12695591/node-js-express-js-how-does-app-router-work

  • 相关阅读:
    CodeForces 219D Choosing Capital for Treeland (树形DP)
    POJ 3162 Walking Race (树的直径,单调队列)
    POJ 2152 Fire (树形DP,经典)
    POJ 1741 Tree (树的分治,树的重心)
    POJ 1655 Balancing Act (树的重心,常规)
    HDU 2196 Computer (树形DP)
    HDU 1520 Anniversary party (树形DP,入门)
    寒门子弟
    JQuery选择器(转)
    (四)Web应用开发---系统架构图
  • 原文地址:https://www.cnblogs.com/james1207/p/3303932.html
Copyright © 2011-2022 走看看