Estoy tratando de obtener una URL de imagen de la API de los más vendidos del NYT y por mi vida no puedo hacer que funcione
Aquí está mi código hasta el momento, en este momento solo estoy tratando de consolar. Registrar la URL solo para ver cómo funciona antes de implementarla (he omitido la clave API pero la tengo y funciona)
Cuando lo ejecuto en mi navegador, el terminal devuelve el código de estado 200 https y el archivo JSON completo como una cadena antes de encontrar "SyntaxError: final inesperado de la entrada JSON en JSON.parse () en IncomingMessage. (C:\Users\esmee\ Desktop\project-bookworm\index.js:18:29) en IncomingMessage.emit (nodo:eventos:520:28) en IncomingMessage.Readable.read (nodo:internal/streams/readable:527:10) en flujo (nodo :internal/streams/readable:1012:34) en resume_ (node:internal/streams/readable:993:3) en processTicksAndRejections (node:internal/process/task_queues:83:21)" y falla
const express = require("express");const https = require("https"); const app = express(); app.get("/", function(req, res) { const url = "https://api.nytimes.com/svc/books/v3/lists/current/hardcover-fiction.json?api-key=" https.get(url, function(response) { console.log(response.statusCode); response.on("data", function(data) { const bookData = JSON.parse(data); const book1url = bookData.results.books[0].book_image; console.log(book1url); }) }) res.send("Server is up and running"); }) app.listen(3000, function() { console.log("Server is running on port 3000."); })Aquí hay una captura de pantalla del JSON devuelto en el navegador desde la URL:
https El problema con su código es que intenta analizar el evento de data , pero el evento data solo indica que se ha recibido una parte de los datos. Por lo tanto, debe concatenar todos los fragmentos de datos juntos y solo tan pronto como se reciba el evento end , que indica que se han recibido todos los fragmentos de datos, puede analizar todo el cuerpo.
import https from "https"; const options = { headers: { // tell API you are expecting a JSON returned in the body "Accept": "application/json" }, }; const url = "https://api.nytimes.com/svc/books/v3/lists/current/hardcover-fiction.json"; https.get(url, options, (res) => { let body = ""; // data is called multiple times and just a chunk of data is returned! res.on("data", (chunk) => { body += chunk; }); // end signals that all data is returned => you can now parse res.on("end", () => { try { const json = JSON.parse(body); console.log(res.statusCode); console.log(json); if(res.statusCode !== 200){ // error handling here console.log(json.fault.faultstring); } else { // successful request -> log the body console.log(json) } } catch (error) { console.error(error.message); } }); }) .on("error", (error) => { console.error(error.message); });node-fetch Como toda esta construcción que usa el paquete https no es muy sencilla, muchas personas usan el paquete node-fetch que simplifica esto y está basado en Promise .
import fetch from "node-fetch"; (async () => { const options = { headers: { // tell API you are expecting a JSON returned in the body Accept: "application/json", }, }; const url = "https://api.nytimes.com/svc/books/v3/lists/current/hardcover-fiction.json"; try { const resp = await fetch(url, options); console.log(resp.status); const body = await resp.json(); console.log(body); if (!resp.ok) { // status code other than 200-299 // some error handling here // in this case log the error message returned from the API console.log(body.fault.faultstring); } else { // successful request -> log the body console.log(body) } } catch (error) { console.error(error); } })();Ambas versiones deben imprimir el mismo resultado. Si no proporciona una clave de API como hice yo, este será el resultado:
401 { fault: { faultstring: 'Failed to resolve API Key variable request.queryparam.api-key', detail: { errorcode: 'steps.oauth.v2.FailedToResolveAPIKey' } } } Failed to resolve API Key variable request.queryparam.api-keyParece que la solicitud no devuelve una salida JSON.
Dado que es una solicitud GET, puede abrir la URL directamente en un navegador y ver qué devuelve.
Se puede publicar el resultado para que tengamos una mejor idea de lo que está pasando.