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

jpfvwuh4  于 2023-02-18  发布在  Node.js
关注(0)|答案(3)|浏览(258)

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

  • NPM - 6.5.0,
  • 节点-11.4.0,
  • 请求-2.88.0,
  • Ubuntu - 16.04( windows -10)

一些代码片段(如果需要)(Express服务器创建和ProjectsController中的特定路径):

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

9jyewag01#

我用过axios,同样的问题。
我的问题是使用encodeURI()encodeURIComponent()函数解决的。

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

PS:对于未来的读者:使用require('url').URL构造一个url对象,并将其传递给node-fetch,后者将自动转义url。
有用链接Link1|Link2

ee7vknir

ee7vknir2#

对我来说,我遇到了一些IDE问题,在一个端点中注入了一些无效的字符。一旦我使用encodeURI,它就显示了导致问题的字符。所以我重新编写了端点,它工作了。
网址:/v2/users/${user.id}/products
阅读内容:/v2/users[some invalid char here]/${user.id}/products

dfuffjeb

dfuffjeb3#

此问题的解决方案是查找向URL包含未转义字符的其他Web资源发送请求的代码片段,然后根据本文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
    });
}

相关问题