(懒人必看) 定义Express的自动路由机制
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');
}