philip ryan
philip ryan

Reputation: 11

Trying to use express middleware to serve third party API requests

Sorry if I posted this incorretly, it is my first question on Stack Overflow. I am currently trying to use express to serve third party API requests to my React front-end. This is because the steam api I use throws me a CORS error when requesting in the client-side. I tried to route the requests to my controller which makes the axios call, but I have had no luck. Not sure if I am doing something completely incorrect.

here is my server.js

    const app = require('./app.js');

    const PORT = process.env.PORT || 3005;

    app.listen(PORT, () => console.log(`Listening on port: ${PORT}`))

and here is my app.js

    const express = require('express');
    const cors = require('cors')
    const app = express();

    app.use(cors())
    module.exports = app

my routes:

    const { Router } = require('express')
    const controllers = require('../controllers')
    const router = Router()

    router.get('/', (req, res) => res.send('This is root!'))

    router.get('/applist', controllers.getAllSteamGames)
    router.get('/game/:id', controllers.getSingleGameSteam )

    router.get('/gameSpy/:id', controllers.getSingleGameSpy)


    module.exports = router

and lastly my controller:

    const axios = require('axios');
    const getAllSteamGames = async () => {
        try {

        const resp = await axios.get('https://api.steampowered.com/ISteamApps/GetAppList/v2?applist')
        return resp.data
        } catch (error) {
            console.log(error)
            throw error
        }
    }

Thank you for your help and time.

Upvotes: 0

Views: 735

Answers (1)

jfriend00
jfriend00

Reputation: 707318

You aren't doing anything to send a response back to the client. If we look at the /applist route:

router.get('/applist', controllers.getAllSteamGames)

const axios = require('axios');
const getAllSteamGames = async () => {
    try {
        const resp = await axios.get('https://api.steampowered.com/ISteamApps/GetAppList/v2?applist');
        return resp.data
    } catch (error) {
        console.log(error)
        throw error
    }
}

All, your getAllSteamGames() function does is return a promise that resolves to a value (remember all async functions return a promise). It doesn't send a response back to the client.

Then, if you look at the actual route handler, it doesn't send a response back to the client either. So, you get the request and never send a response. The client never gets a response.

What I would suggest is that you just send a response in your controller. It's already passed (req, res) as arguments to the function so you can use them.

router.get('/applist', controllers.getAllSteamGames)

const axios = require('axios');
const getAllSteamGames = async (req, res) => {
    try {
        const resp = await axios.get('https://api.steampowered.com/ISteamApps/GetAppList/v2?applist');
        res.json(resp.data);
    } catch (error) {
        // send error status upon error
        console.log(error);
        res.sendStatus(500);
    }
}

Upvotes: 1

Related Questions