https.get无法使用Nodejs访问公共API



我目前正试图使用Node的模块HTTPS访问JokeAPI,下面是我的代码:

const https = require('https');
let url = 'https://v2.jokeapi.dev/joke/Any';
https.get(url, function (res) {
console.log(res);
})

然而,不知怎么的,我一直得到这个错误:

node:events:498
throw er; // Unhandled 'error' event
^
Error: self signed certificate in certificate chain
at TLSSocket.onConnectSecure (node:_tls_wrap:1530:34)
at TLSSocket.emit (node:events:520:28)
at TLSSocket._finishInit (node:_tls_wrap:944:8)
at TLSWrap.ssl.onhandshakedone (node:_tls_wrap:725:12)
Emitted 'error' event on ClientRequest instance at:
at TLSSocket.socketErrorListener (node:_http_client:442:9)
at TLSSocket.emit (node:events:520:28)
at emitErrorNT (node:internal/streams/destroy:157:8)
at emitErrorCloseNT (node:internal/streams/destroy:122:3)
at processTicksAndRejections (node:internal/process/task_queues:83:21) {
code: 'SELF_SIGNED_CERT_IN_CHAIN'

是因为我没有设置服务器吗?我是JS和Node的初学者,所以任何帮助都将不胜感激。非常感谢。

编辑:我实际上添加了process.env['NODE_TLS_REJECT_UNAUTHORIZED']='0';'到代码顶部,它起作用了,但现在我得到了一个"未定义"的响应体。我不知道为什么会发生这种情况:(

我的系统没有显示self signed certificate in certificate chain错误,但听起来您有解决方法。

然而,现在我得到了一个"未定义"的响应体。我不太确定是什么原因造成的。

https.get()只是发送请求并读取标头。它本身并没有解读整个回应。为此,您需要侦听res对象上的data事件。为data事件安装侦听器将导致流开始从传入请求中读取数据。这些数据不一定会同时出现。它可以分解为多个data事件,因此您确实需要累积所有数据,然后在end事件中,您知道您拥有所有数据。您可以在http.get()文档中看到关于如何实现它的完整示例。

这里有一个更简单的版本,它将向您展示每个data事件中的内容。

const https = require('https');
let url = 'https://v2.jokeapi.dev/joke/Any';
https.get(url, function(res) {
res.on('data', data => {
console.log(data.toString());
});
});

仅供参考,我不再使用普通的https.get(),因为这里列出的所有更高级别的库都更方便使用,并且所有的支持承诺都是异步请求编程的一种更容易的方式。

这个列表中我最喜欢的库是got((,但你可以选择你喜欢的API和/或功能。下面是一个使用got():的实现

const got = require('got');
const url = 'https://v2.jokeapi.dev/joke/Any';
got(url).json().then(result => {
console.log(result);
}).catch(err => {
console.log(err);
});

最新更新