Entonces, estoy tratando de extraer los datos de una API usando axios para renderizar en mi vista EJS:
const axios = require('axios'); const express = require("express"); const bodyParser = require("body-parser"); const app = express(); app.set('view engine', 'ejs'); app.use(bodyParser.urlencoded({extended: true})); app.use(express.static("public")); app.get("/test", (req, res, next) => { let productApi = axios.get("https://swapi.dev/api/people/1") .then(response => res.json(response.data)) res.render('produtos2', {product: productApi}) })pero recibo el error: Error [ERR_HTTP_HEADERS_SENT]: no se pueden establecer encabezados después de enviarlos al cliente
si lo uso asi:
app.get("/test", (req, res, next) => { let productApi = axios.get("https://swapi.dev/api/people/1") .then(response => res.json(response.data)) })devuelve los datos, pero no puedo representar la vista 'produtos2' usando EJS.
Mi código EJS:
<%- include('partials/header') %> teste view <%= product[0] %> <%- include('partials/footer') %>el problema es que mezclas res.render y res.json , y que node.js se ejecuta de forma asíncrona
por lo tanto, res.render se ejecuta antes de que se complete la solicitud de axios, envía un objeto de promesa, no datos, y cuando finaliza la solicitud, res.json provoca el error ERR_HTTP_HEADERS_SENT . Además, no necesita res.json en absoluto, solo pase los datos de la solicitud a la vista.
por lo tanto, debe procesar los datos después de que se realiza la solicitud
en su segundo fragmento de código, comenzó bien, allí es donde obtiene los datos, y luego necesita representar la vista, y en lugar de res.json , simplemente pasa los datos de solicitud:
app.get("/test", (req, res, next) => { axios.get("https://swapi.dev/api/people/1") .then(response => { res.render('produtos2', {product: response.data }); }); });o con async/await de uso común:
app.get("/test", async (req, res, next) => { let productApi; try { productApi = await axios.get("https://swapi.dev/api/people/1") } catch(err) { console.error(err); return res.end('err'); } res.render('produtos2', {product: productApi.data }); });