Entonces, digamos que tengo el directorio /api/cat/fact.js .
Quiero obtener datos JSON de catfact.ninja
La cuestión es que no puedo usar el paquete require() o request() , porque si usara require , diría que no se pudo encontrar el módulo ... , y si usé request one, en lugar de devolver los datos JSON que usted puede para ver en catfact.ninja , devuelve JSON sobre la API, como nombre de host , puerto , que no necesito
/API/api/cat/fact.js:
const express = require('express'); const app = express.Router(); const request = require('request') app.use('', (req, res) => { const src = 'https://catfact.ninja/fact'; const facts = request({ uri: src, hostname: 'catfact.ninja', port: 443, path: '/fact', method: 'POST', json: 'fact' }, (error, response, body) => { if (error) console.log(error) console.log(body, '\n\n' + response.fact) }) console.log(facts); return res.jsonp(facts) }) module.exports = app;Estás devolviendo JSON en el lugar equivocado. Debe devolverse dentro de la función de devolución de llamada.
Aquí está la solución:
const express = require('express'); const request = require('request-promise') const app = express(); app.use('', async (req, res) => { const src = 'https://catfact.ninja/fact'; try { const response = await request({ uri: src, port: 443, method: 'GET', json: true }) return res.jsonp(response) } catch (err) { return res.jsonp(err) } }) function startServer() { const port = 3000 app.listen(port, () => { console.info('Server is up on port ' + port) }) app.on('error', (err) => { console.error(err) process.exit(1) }) } startServer() SUGERENCIA: sugiero usar el paquete request-promise npm en lugar del paquete request , ya que proporciona un enfoque de espera asincrónica, que es más limpio. De lo contrario, puede continuar usando la función de devolución de llamada como segundo parámetro de función de request() .