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

时间:2019-01-03 15:55:43

标签: node.js express npm ubuntu-16.04

我正在使用Ubuntu来处理带有以下URL的传入HTTP请求:http:// myIp :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)上运行,并且不会发生错误。此外,API端点(例如http:// myIp :3000 / v1 / community / list)在所有设备上均可正常工作。

这是我的组件版本: 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
});

3 个答案:

答案 0 :(得分:15)

我用过axios,并且发生了相同的问题。

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

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

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

有用链接Link1 | Link2

答案 1 :(得分:0)

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

const request = require('request');

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

答案 2 :(得分:0)

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

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

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