No puedo entender cómo funcionan https.get y https.request.
Hay un pequeño ejemplo que muestra el problema.
Hay un código:
# # r.js # import https from 'https' async function runGetRequest () { return new Promise((resolve, reject) => { const req = https.get({ hostname: 'jsonplaceholder.typicode.com', method: 'GET', path: '/todos/1' }, (resp) => { console.log(`statusCode: ${resp.statusCode}`) const data = [] resp.on('data', (chunk) => { data.push(chunk) }) resp.on('end', () => { resolve(Buffer.concat(data).toString()) }) resp.on('error', (err) => { reject(err) }) }).on('error', (err) => { reject(err) }).on('timeout', (err) => { reject(err) req.abort() }).on('uncaughtException', (err) => { reject(err) req.abort() }) }) } async function runRequest () { return new Promise((resolve, reject) => { const req = https.request({ hostname: 'jsonplaceholder.typicode.com', method: 'GET', path: '/todos/1' }, (resp) => { console.log(`statusCode: ${resp.statusCode}`) const data = [] resp.on('data', (chunk) => { data.push(chunk) }) resp.on('end', () => { resolve(Buffer.concat(data).toString()) }) resp.on('error', (err) => { reject(err) }) }).on('error', (err) => { reject(err) }).on('timeout', (err) => { reject(err) req.abort() }).on('uncaughtException', (err) => { reject(err) req.abort() }) }) } console.log(await runGetRequest()) console.log(await runRequest())Que funciona así:
node --harmony-top-level-await --es-module-specifier-resolution=node --inspect r.jsEn el primer caso se utiliza https.get y en el segundo https.request.
El primero funciona.
En el segundo, me sale un error:
Error: socket hang up at connResetException (node:internal/errors:691:14) at TLSSocket.socketOnEnd (node:_http_client:471:23) at TLSSocket.emit (node:events:406:35) at endReadableNT (node:internal/streams/readable:1343:12) at processTicksAndRejections (node:internal/process/task_queues:83:21) { code: 'ECONNRESET' } node --version v16.9.1¿Dónde está el error en el código?
Gracias.
La diferencia es que con https.request tenemos que enviar la solicitud explícitamente llamando a req.end()
async function runRequest () { return new Promise((resolve, reject) => { const req = https.request({ hostname: 'jsonplaceholder.typicode.com', method: 'GET', path: '/todos/1' }, (resp) => { console.log(`statusCode: ${resp.statusCode}`) const data = [] resp.on('data', (chunk) => { data.push(chunk) }) resp.on('end', () => { resolve(Buffer.concat(data).toString()) }) resp.on('error', (err) => { reject(err) }) }).on('error', (err) => { reject(err) }).on('timeout', (err) => { reject(err) req.abort() }).on('uncaughtException', (err) => { reject(err) req.abort() }) req.end() // < add this call }) } https.get hace esa llamada internamente: https://github.com/nodejs/node/blob/55379eb454622d0a0cac2467532579a7ad44ca25/lib/https.js#L388