我正在使用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 node
或ps 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
});
答案 0 :(得分:15)
我用过axios
,并且发生了相同的问题。
我的问题已使用encodeURI()
或encodeURIComponent()
函数解决。
const URI = 'example.com';
const encodedURI = encodeURI(URI);
PS :对于将来的读者:使用require('url').URL
来构造一个url对象并将其传递给node-fetch,它将为您自动转义url。
答案 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