最近在学express所以看到了中间件,就像既然中间件这么灵活,自己都可以定制中间件了。
于是来个有特色的,在url、express支持中文路径。
使用的url。
http://127.0.0.1:3000/users/%E6%B5%8B%E8%AF%95?a=1%E8%A6%81
当然param不在我的考虑范围之类。
urlchineseroute.js
/**
* Created by Administrator on 15-4-29.
*/
var url = require("url");
module.exports = urlEncodeChinese;
/**
* url中文路径解析中间件
*/
function urlEncodeChinese(req,res,next){
var decodeurlchinese = url.parse(req.url);
var tmpdecodepath = decodeurlchinese.pathname;
decodeurlchinese.pathname = decodeURIComponent(decodeurlchinese.pathname);
decodeurlchinese.path = decodeurlchinese.path.replace(tmpdecodepath,decodeurlchinese.pathname); // 不需要正则全局替换,这样有可能把参数也给替换了
// decodeurlchinese.href = decodeurlchinese.href.replace(tmpdecodepath,decodeurlchinese.pathname); // 同上(只用转换一个即可)
// 因为for ...in 虽然可以全部便利object 名称但有时输出一些内容时显不会,所以暂时先替换req里的url、originalUrl(path暂时不替换),路由能正确识别中文了。
//暂时先这样,下次把req里面全都遍历完。
// console.log(decodeurlchinese.path);
req.url = req.originalUrl = decodeurlchinese.path;
next();
}
app.js
var express = require('express');
...
var tool_base = require('urlchineseroute'); // 加载自定义中间件
...
var users = require('./routes/users'); // 加载用户路由模块
...
var app = express();
...
app.use(tool_base); // 使用url中文路由模块
app.use('/users', users); // 将user路由模块绑定到'/users'目录下。
usres.js
var express = require('express');
var router = express.Router();
/* GET users listing. */
router.get('/', function(req, res, next) {
res.send('访问用户主页');
});
// 写个中间件 先将中文过滤了,xss?也可以在入口的地方过滤?好像还是不怎么完善。
router.get('/测试', function(req, res, next) {
res.send(req.param("id"));
});
module.exports = router;
不使用中间件,直接修改源码
当然用替换req的方式有可能难免漏掉什么,所以。。。最保险的是修改express项目根目录\node_modules\express\node_modules\parseurl\index.js当中的fastparse方法即可。function fastparse(str) {
// Try fast path regexp
// See: https://github.com/joyent/node/pull/7878
var simplePath = typeof str === 'string' && simplePathRegExp.exec(str)
// Construct simple URL
if (simplePath) {
var pathname = simplePath[1]
var search = simplePath[2] || null
var url = Url !== undefined
? new Url()
: {}
url.path = str
url.href = str
url.pathname = pathname
url.search = search
url.query = search && search.substr(1)
return url
}
return parse(str)
}
这个方法我没修改,可以参考上面的方式修改即可。