(懒人必看) 定义Express的自动路由机制
发布于 2年前 作者 tonny 1364 次浏览

Express的路由机制不是很好用,每增加一个页面都要配置下,但如果我们约定下路由规则,我们就可以事半功倍,下面是我的实现,希望大家讨论

  /**
 * 用一个方法设置整个路由规则 (/*.node的都走这个规则)
 * 
 *   /test.node -> require('./routes/test').index
 *   /test.hello.node -> require('./routes/test').hello
 *   / -> require('./routes/index').index;
 *   /tests -> require('./routes/tests/index').index
 * 
 * [@type](/user/type) {[type]}
 */
var EXT = '.node';
var ROUTES_PATH = __dirname + '/routes/';
app.all(['/','/[^.]+','/*'+EXT],function(req,res,next){
  var method = req.route.method;
  var reqParam = req.route.params;
  var path = reqParam?reqParam[0].replace(EXT,''):'/';
  path += ~path.lastIndexOf('.')?'':'.index';
  var pathArr = path.split('.')
  var requirePath = pathArr[0];
  var requestMethod = pathArr[1];
  var route = require(ROUTES_PATH+requirePath);
  route && route[method] && route[method][requestMethod] && (console.log(ROUTES_PATH+requirePath,method,requestMethod),route[method][requestMethod](req,res,next));
});

如:./routes/test.js如下:

var upload = require('utils/upload');
exports.get = {
    index: function(req,res){
        res.send('test index');
    }
    , hello: function(req,res){
        res.send('hello world');
    }
    , upload: function(req,res){
        res.render('tests/upload',{
            title: 'test upload',
            ext: require('../config/Global.json').ext
        });
    }
}
exports.post = {
    upload: upload.uploadToPublic
}

utils/upload.js如下:

var fs = require('fs')
    , path = require('path'),
    md5 = require('utils/md5');
exports.uploadToPublic = function(req, res) {
    /*
    这里可以在表单中添加相同名称的file,判断file的名字的length得出
    是不是多文件上传,多文件上传时是一个数组,单文件时是一个对象
    */
    // console.log(req.files.thumbnail);
    // res.send(JSON.stringify(req.files.thumbnail));
    // return;
    // 获得文件的临时路径
    var tmp_path = req.files.thumbnail.path;
    // 指定文件上传后的目录 - 示例为"images"目录。
    var file_name = req.files.thumbnail.name;
    var ext = path.extname(file_name);
    var imgPath = '/images/' + md5(file_name) + ext;
    var target_path = './public' + imgPath;
    // 移动文件
    fs.rename(tmp_path, target_path, function(err) {
        if(err) throw err;
        // 删除临时文件夹文件, 
        fs.unlink(tmp_path, function() {
            if(err) throw err;
            res.send('File uploaded to: ' + target_path + ' - ' + req.files.thumbnail.size + ' bytes'+'<br/><img src="'+imgPath+'"/>');
        });
    });
}

utils/md5.js如下:

var crypto = require('crypto');
//这里的exports只是module.exports的一个引用,因此直接改变其值是没用的
//要让exports返回一个函数,请写module.exports
exports = module.exports = function(text){
    return crypto.createHash('md5').update(text).digest('hex');
}
回到顶部