Попытка использовать промежуточное ПО express для обслуживания запросов сторонних API - PullRequest
0 голосов
/ 09 февраля 2020

Извините, если я опубликовал это некорректно, это мой первый вопрос о переполнении стека. В настоящее время я пытаюсь использовать express для обслуживания сторонних API-запросов к моему React-интерфейсу. Это связано с тем, что используемый мной API-интерфейс Steam вызывает ошибку CORS при запросе на стороне клиента. Я пытался перенаправить запросы на мой контроллер, который делает вызов ax ios, но мне не повезло. Не уверен, что я делаю что-то совершенно неправильно.

вот мой сервер. js

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

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

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

и вот мое приложение. js

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

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

мои маршруты:

    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

и, наконец, мой контроллер:

    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
        }
    }

Спасибо за вашу помощь и время.

1 Ответ

0 голосов
/ 09 февраля 2020

Вы ничего не делаете, чтобы отправить ответ клиенту. Если мы посмотрим на маршрут /applist:

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
    }
}

Все, ваша функция getAllSteamGames() возвращает обещание, которое разрешается до значения (помните, что все функции async возвращают обещание). Он не отправляет ответ клиенту.

Затем, если вы посмотрите на фактический обработчик маршрута, он также не отправит ответ клиенту. Таким образом, вы получаете запрос и никогда не отправляете ответ. Клиент никогда не получает ответ.

Я хотел бы предложить, чтобы вы просто отправили ответ в свой контроллер. Он уже передан (req, res) в качестве аргументов функции, поэтому вы можете использовать их.

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);
    }
}
...