TypeError [ERR_UNESCAPED_CHARACTERS] 请求路径包含非转义字符

Posted

技术标签:

【中文标题】TypeError [ERR_UNESCAPED_CHARACTERS] 请求路径包含非转义字符【英文标题】:TypeError [ERR_UNESCAPED_CHARACTERS] Request path contains unescaped characters 【发布时间】:2019-05-30 05:52:09 【问题描述】:

我正在使用来自以下 URL 的传入 HTTP 请求在 Ubuntu 上工作:

http://<MY-IP>:3000/v1/projects/list

说明: 问题是我在终端中收到以下错误:

TypeError [ERR_UNESCAPED_CHARACTERS]: Request path contains unescaped characters
at new ClientRequest (_http_client.js:127:13)
at Object.request (https.js:300:10)
at Request.start (/home/dev/grem-api-dev/apiv3/node_modules/request/request.js:751:32)
at Request.end (/home/dev/grem-api-dev/apiv3/node_modules/request/request.js:1512:10)
at end (/home/dev/grem-api-dev/apiv3/node_modules/request/request.js:564:14)
at Immediate._onImmediate (/home/dev/grem-api-dev/apiv3/node_modules/request/request.js:578:7)
at processImmediate(timers.js:632:19)

在此错误节点进程从终端消失后(但仍在工作并且 API 响应已正确发送),但我看不到它是否正常工作(image attached)。因此,与节点进程交互的唯一方法是执行ps aux | grep nodeps T 之类的操作并手动终止进程。

假设错误意味着我找到了出现错误的适当代码片段 (request.js:751:32)。这里是:

  try 
    self.req = self.httpModule.request(reqOptions)
   catch (err) 
    self.emit('error', err)
    return
  

我找到的唯一解决方案是评论 self.emit('error', err) 代码行,这显然与最佳实践相去甚远。

事实上,相同的代码可以在具有相同组件版本的其他计算机(Ubuntu、Windows)上运行,并且不会发生错误。此外,像 http://myIp:3000/v1/community/list 这样的 API 端点在所有设备上都可以正常工作。

这是我的组件版本:

npm — 6.5.0,

节点——11.4.0,

请求——2.88.0,

Ubuntu — 16.04 (Windows — 10)

如果需要一些代码片段(Express Server 创建和 ProjectsController 中的特定路由):

const app = express();
app.use('/v1/projects/', ProjectsController);
    
const router = express.Router();
router.post('/list', function(req,res)
   //logic
);

【问题讨论】:

【参考方案1】:

此问题的解决方案是查找向其他 Web 资源发送请求的代码片段,其 URL 包含非转义字符,然后根据本文 https://www.w3schools.com/tags/ref_urlencode.asp 替换它们。该片段是按条件执行的,这就是为什么只有一台具有特定操作系统的服务器通过 if/else 语句。

const request = require('request');

if (...) 
else 
    request.get(...) //source of error
    .on('response', function(response) 
        //logic
    );

【讨论】:

嘿,你试过encodeURI(url)这里的详细信息(w3schools.com/jsref/jsref_encodeURI.asp)吗? @AbhijithS 当然,未转义字符已被此函数正确转义。感谢您的关注! 您能解释一下吗? @MostafaGhadimi 好吧,在形成 URI 时,您总是需要转义特殊字符(空格键、&、?等)。否则你会得到 ERR_UNESCAPED_CHARACTERS 错误。无需更改任何 npm 模块的源代码。【参考方案2】:

我使用了axios,也出现了同样的问题。

使用encodeURI()encodeURIComponent() 函数解决了我的问题。

const URI = 'example.com';
const encodedURI = encodeURI(URI);

PS:对于未来的读者:使用require('url').URL 构造一个 url 对象并将其传递给 node-fetch,它会自动为您转义 url。

有用的链接:Link1 | Link2

【讨论】:

【参考方案3】:

对我来说,我遇到了一些 IDE 问题,在端点中注入了一些无效字符。一旦我使用了encodeURI,它就会发现是什么字符导致了问题。所以我重新编写了端点并且它工作了。

网址:/v2/users/$user.id/products

正在阅读的内容:/v2/users[some invalid char here]/$user.id/products

【讨论】:

以上是关于TypeError [ERR_UNESCAPED_CHARACTERS] 请求路径包含非转义字符的主要内容,如果未能解决你的问题,请参考以下文章

TypeError:“__ensemble__”对象不可调用

TypeError: __init__() 得到了一个意外的关键字参数“评分”

TypeError: __init__() 接受 2 个位置参数,但给出了 4 个

TypeError: __init__() 接受 1 个位置参数,但给出了 3 个

TypeError:“NoneType”对象没有属性“__getitem__”

TypeError: __init__() 接受 1 个位置参数,但给出了 2 个