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

  • 相关阅读:
    winform中利用正则表达式得到有效的电话/手机号
    winform运行时如何接受参数?(示例)
    [基础]Javascript中的继承示例代码
    [转]C#中"is" vs "as"
    Javascript数组常用方法[包含MS AJAX.NET的prototype扩展方法]示例
    linq学习笔记(一)
    用winform应用程序登录网站的解决方案
    [转贴]操纵自如--页面内的配合与通信
    .net3.0中的扩展方法(示例)
    window.location或window.open如何指定target?
  • 原文地址:https://www.cnblogs.com/james1207/p/3303932.html
Copyright © 2011-2022 走看看