快速路由非 ascii 字符(波斯语)

Express routing non ascii characters (Farsi)

我正在尝试使用这条路线 http://localhost:3030/api/words/عشق 在我的 Express 应用程序中,所以我可以匹配字典中的单词。

浏览器将 url 更改为 http://localhost:3030/api/words/%D8%B9%D8%B4%D9%82 但我编写了一个小型中间件,可在将其传递给路由之前将其转换回原始版本。在路由中,我有一个正则表达式来检查包含 farsi/persian 个字符的 unicode 字符。

不确定发生了什么,因为中间件打印 /words/عشق,如果我删除正则表达式规则,路由也会打印 /words/عشق。为什么快递不匹配这个? express 不使用 req.url 来确定路线吗?

    /** Get word be string **/
    api.get('/:word(^([\u0600-\u06FF]+\s?)+$)', (req, res, next) =>{
            console.log("persian version " + req.url);
            res.send(req.params);
});


 /** Url encoder middleware **/ 
function urlencoder(req, res, next) {
      req.url = decodeURIComponent(req.url); 
      console.log("Middleware " + req.url);
      next();
}

我认为将路由路径转换为正则表达式的代码已经为正则表达式添加了锚点前缀 (^),因此您不应该在您的代码中使用额外的锚点。

这似乎有效:

let unescape = require('querystring').unescape;

api.use((req, res, next) => {
  req.url = unescape(req.url);
  next();
});

api.get('/:word(([\u0600-\u06FF]+\s?)+$)', (req, res) => {
  console.log("persian version " + req.url);
  res.send(req.params);
});