node.js express 支持中文路由的中间件

最近在学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)
}
这个方法我没修改,可以参考上面的方式修改即可。




猜你喜欢

转载自blog.csdn.net/ozhangsangong/article/details/45391613