(懒人必看) 定义Express的自动路由机制
发布于 11 年前 作者 tonny 10539 次浏览 最后一次编辑是 8 年前

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');
}
回到顶部