我正在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服务器创建和ProjectsController中的特定路径):
const app = express();
app.use('/v1/projects/', ProjectsController);
const router = express.Router();
router.post('/list', function(req,res){
//logic
});
3条答案
按热度按时间9jyewag01#
我用过
axios
,同样的问题。我的问题是使用
encodeURI()
或encodeURIComponent()
函数解决的。PS:对于未来的读者:使用
require('url').URL
构造一个url对象,并将其传递给node-fetch,后者将自动转义url。有用链接:Link1|Link2
ee7vknir2#
对我来说,我遇到了一些IDE问题,在一个端点中注入了一些无效的字符。一旦我使用
encodeURI
,它就显示了导致问题的字符。所以我重新编写了端点,它工作了。网址:
/v2/users/${user.id}/products
阅读内容:
/v2/users[some invalid char here]/${user.id}/products
dfuffjeb3#
此问题的解决方案是查找向URL包含未转义字符的其他Web资源发送请求的代码片段,然后根据本文https://www.w3schools.com/tags/ref_urlencode.asp替换它们。此片段是按条件执行的,这就是为什么只有一台具有特定操作系统的服务器通过if/else语句的原因。