尝试使用express中间件服务第三方API请求

尝试使用express中间件服务第三方API请求,express,cors,axios,Express,Cors,Axios,很抱歉,如果我发布的不正确,这是我关于堆栈溢出的第一个问题。我目前正在尝试使用express向我的React前端提供第三方API请求。这是因为我使用的steam api在客户端请求时抛出了一个CORS错误。我试图将请求路由到我的控制器,该控制器发出axios调用,但我没有成功。不确定我是否做了完全错误的事情 这是我的server.js const app = require('./app.js'); const PORT = process.env.PORT || 3005;

很抱歉,如果我发布的不正确,这是我关于堆栈溢出的第一个问题。我目前正在尝试使用express向我的React前端提供第三方API请求。这是因为我使用的steam api在客户端请求时抛出了一个CORS错误。我试图将请求路由到我的控制器,该控制器发出axios调用,但我没有成功。不确定我是否做了完全错误的事情

这是我的server.js

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

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

    app.listen(PORT, () => console.log(`Listening on port: ${PORT}`))
这是我的app.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
        }
    }

谢谢你的帮助和时间

您没有做任何事情将响应发送回客户端。如果我们查看
/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
函数都返回承诺)。它不会将响应发送回客户端

然后,如果您查看实际的路由处理程序,它也不会将响应发送回客户端。因此,您收到请求,但从未发送响应。客户端从未得到响应

我建议您只需在控制器中发送响应。它已经作为参数传递给函数,以便您可以使用它们

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

啊,我明白你的意思了。我认为您可以从axios调用返回响应,而它隐式地是控制器的响应。我会尝试解决这个问题,谢谢你的帮助。@philipryan-你的控制器只是一个普通的Javascript对象,你可能会把它当作代码建议。它根本没有特殊的功能——它只是一种组织请求处理函数的方法。代码中的某些内容必须返回响应。如果这回答了您的问题,那么您可以通过单击答案左侧的复选标记向社区表明这一点,并通过在此处遵循正确的程序为自己赢得一些声誉点数。更新:是!它成功了,非常感谢。尝试将循环结构转换为json时,我遇到了一个类型错误。我把resp改为resp.data,它成功了。