有什么原因不能从Express.js router.put()内部执行GET请求吗?
我有两条路。完全相同的api调用在router.get()路由中工作,并挂在router.put()中。
我已经证实
这样做是可行的:
router.get('/:id', async (req, res) => {
const { headers } = req;
let result;
try {
result = await axios({ method:'get', url: '/some-url', headers });
} catch(error) {
res.status(500).send(new Error('myError');
}
res.send({ result });
});这样做是行不通的:
router.put('/:id', async (req, res) => {
const { headers } = req;
let result;
let finalResult;
try {
result = await axios({ method:'get', url: '/some-url', headers });
} catch(error) {
res.status(500).send(new Error('myError');
}
// logic based on the result of the above GET determines what the value of `finalResult`
finalResult = { some: 'data' };
res.send({ finalResult });
});尽管axios({ method:'get', url: '/some-url' })在这两条线路上都是完全相同的,但它在一条而不是另一条路上工作。
router.put()路由总是挂起很长时间,最终节点输出:Error: socket hang up, code: 'ECONNRESET', etc...
感谢你的帮助,我花了一天的时间为这件事挠头。
发布于 2020-01-13 21:37:11
问题的根本原因:
http头有一个Content-Length键,阻止GET调用正确解析。
由于这些api调用发生在router.put()回调中,因此报头有一个Content-Length,该Content-Length指向开始放置的负载“主体”的大小。
解决方案:
在router.put()中执行GET时,从Header中移除该GET字段,这样GET具有除Content-Length之外的所有其他标头数据
不幸的是,NodeJS只是抛出了这个Error: socket hang up消息,这个消息并不能很好地描述根本的问题。
发布于 2020-01-11 20:27:49
不,没有特快专递。尝试点击邮递员或卷发的GET请求,看看是否有响应。根本原因可能是您试图发出的get请求无效,或者您正在发出GET请求的服务器可能已关闭。您可以运行以下命令来验证
app.put('/',async (req, res) => {
let response = await axios.get('https://google.co.in');
console.log(response.data);
res.send({"works": "hello"});
});https://stackoverflow.com/questions/59698241
复制相似问题