TypeError [ERR_UNESCAPED_CHARACTERS] 请求路径包含未转义的字符
TypeError [ERR_UNESCAPED_CHARACTERS] Request path contains unescaped characters
我正在 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 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
});
此问题的解决方案是找到使用 URL 向其他 Web 资源发送请求并包含未转义字符的代码片段,然后根据本文 https://www.w3schools.com/tags/ref_urlencode.asp 替换它们。此片段按条件执行,这就是为什么只有 1 个具有特定 OS 的服务器通过 if/else 语句。
const request = require('request');
if (...) {}
else {
request.get(...) //source of error
.on('response', function(response) {
//logic
});
}
我用过axios
也出现了同样的问题。
我的问题已使用 encodeURI()
或 encodeURIComponent()
函数解决。
const URI = 'example.com';
const encodedURI = encodeURI(URI);
PS:对于未来reader:使用require('url').URL
构造一个url对象并将其传递给node- fetch,它会自动转义 url 给你。
有用链接: | Link2
对我来说,我遇到了一些 IDE 问题,在端点中注入了一些无效字符。一旦我使用 encodeURI
,它就会揭示是什么字符导致了问题。所以我重新编写了端点并且它起作用了。
URL: /v2/users/${user.id}/products
正在阅读的内容:/v2/users[some invalid char here]/${user.id}/products
我正在 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 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
});
此问题的解决方案是找到使用 URL 向其他 Web 资源发送请求并包含未转义字符的代码片段,然后根据本文 https://www.w3schools.com/tags/ref_urlencode.asp 替换它们。此片段按条件执行,这就是为什么只有 1 个具有特定 OS 的服务器通过 if/else 语句。
const request = require('request');
if (...) {}
else {
request.get(...) //source of error
.on('response', function(response) {
//logic
});
}
我用过axios
也出现了同样的问题。
我的问题已使用 encodeURI()
或 encodeURIComponent()
函数解决。
const URI = 'example.com';
const encodedURI = encodeURI(URI);
PS:对于未来reader:使用require('url').URL
构造一个url对象并将其传递给node- fetch,它会自动转义 url 给你。
有用链接:
对我来说,我遇到了一些 IDE 问题,在端点中注入了一些无效字符。一旦我使用 encodeURI
,它就会揭示是什么字符导致了问题。所以我重新编写了端点并且它起作用了。
URL: /v2/users/${user.id}/products
正在阅读的内容:/v2/users[some invalid char here]/${user.id}/products