我试图在node express的路由中获得https请求的结果,但失败的原因是:连接ETIMEOUT。知道我错了吗?
router.get("/", async (req, res) => {
try {
result = await https.get('https://api.nasa.gov/planetary/apod?api_key=DEMO_KEY');
console.log(result);
res.send(result);
}
catch (err) {
console.log(err);
}
});
编辑: 该URL有效,并且在粘贴到浏览器中时确实会返回某些内容,
我的API中的其他端点可以正常工作,但是它们没有想到http请求。它们看起来像这样:
router.get("/", (req, res) => {
try {
res.sendFile("\\\\abc.local\\a$\\b$\\xyz\\001-005-877.pdf");
}
catch (err) {
res.status(500).json({ err: err.toString() });
}
});
编辑: 完成: 我在index.js /路由中出现输入错误(app.use(“ / test”,require(“ ./ routes / test”)));这导致了超时。 然后使用此代码:
router.get("/", (req, res) => {
request('https://api.nasa.gov/planetary/apod?api_key=DEMO_KEY', function (error, response, body) {
console.log('error:', error);
console.log('statusCode:', response && response.statusCode);
console.log('body:', body);
})
});
我使用了模块“请求”。正如 Dijkstra 所建议的那样,即使他的代码(用于明确的默认http请求)对我来说不起作用,他仍然提供了解决问题所需的一切,所以谢谢。
答案 0 :(得分:0)
我相信https.get()
的工作方式不是这样。文档为here。
可能的实现:
router.get("/", async (req, res) => {
https.get('https://api.nasa.gov/planetary/apod?api_key=DEMO_KEY', (result) => {
console.log('statusCode:', res.statusCode);
console.log('headers:', res.headers);
const data = '';
result.on('data', function (chunk) {
body += chunk;
});
result.on('end', () => {
res.send(JSON.parse(data));
});
}).on('error', (e) => {
console.error(e);
});
});
这是执行此类典型任务的非常复杂的代码。这就是为什么有流行的软件包可以处理后台所有复杂部分的原因。我更喜欢使用Request。