I'm working on a full-stack Node app using Express, with Axios to make a call to an external API. My API call is working, but it doesn't seem to send any data back to my route handler and I'm getting a browser timeout and then the message:
"localhost didn't send any data ERR_EMPTY_RESPONSE"
Here is my route handler, routes/met_route.js:
'use strict';
import express from "express";
import metData from "../models/metData.js";
const router = express.Router();
router.get('/', metData.searchArt, (req, res) => {
res.send(res.data)
})
export default router;
And here is my code with the API call, models/metData.js:
'use strict';
import axios from "axios";
const metAPI = {
searchArt: function() {
axios.get("https://collectionapi.metmuseum.org/public/collection/v1/objects/11")
.then(response => {
console.log(response.data)
})
.catch(error => console.error('error:', error));
}
};
export default metAPI;
My main server.js file is as follows:
import express from "express";
import cors from "cors";
import homeRoute from "../routes/home_route.js";
import metRoute from '../routes/met_route.js';
const PORT = process.env.PORT || 5050;
const app = express();
app.use(cors());
app.use(express.json());
//routing
app.use("/", homeRoute);
app.use("/met", metRoute);
// start the express server
app.listen(PORT, ()=> {
console.log(`server listening on port ${PORT}`);
});
The route /met works fine as long as I don't make a router.get request to my models/metData.js file, but once I make that request I am getting the error above. I am wondering if it could be an async issue. Any insight would be greatly appreciated.
Your searchArt
function doesn't do anything with the response other than log it. It's also invalid as an Express middleware function because it never calls next()
(see https://expressjs.com/en/guide/writing-middleware.html).
It seems to me that your searchArt
function should instead simply return a promise resolving with the data you want. You can call this function directly from your route handler, there's no need to try and use it as middleware
const metAPI = {
async searchArt() {
return (
await axios.get(
'https://collectionapi.metmuseum.org/public/collection/v1/objects/11',
)
).data;
},
};
// Express v5
router.get('/', async (req, res) => {
res.send(await metData.searchArt());
});
// or
// Express v4
router.get('/', async (req, res, next) => {
try {
res.send(await metData.searchArt());
} catch (err) {
next(err);
}
});
See the error handling guide for information on the differences between v4 and v5 when it comes to async functions.